pyeos的最初的目的是研究Eos的實現(xiàn)方式,添加了python作為智能合約語言匿级。解釋器最早用選用的是cpython染厅,后來改用了更小更靈活更高效安全的micropython作為解釋器肖粮。python的優(yōu)勢在上一篇文章中已經(jīng)講過了涩馆。但是要將python作為智能合約語言運行在eos上面,卻并不是簡簡單單的wrapping一下C/C++的代碼那么簡單屋讶。智能合約會在所有的全結(jié)點中運行须教,這也就意味著如果智能合約語言的某些漏洞,例如緩存溢出漏洞乐疆,受影響的就不僅僅是單個賬戶那么簡單了贬养,還有可能會影響到運行智能合約的所有主機误算,這有可能是災(zāi)難性的。這就是為什么不建議智能合約設(shè)計得過于復(fù)雜的原因咖杂。復(fù)雜度越高,意味著越難維護,同時也面臨更多的安全威脅。python從Guido van Rossum發(fā)布第一個版本的1991年到現(xiàn)在,已經(jīng)有26年模蜡,可以說python已經(jīng)是非常成熟的技術(shù)了。期間python是在不斷的演化卤妒,也產(chǎn)生了很多的變種(例如micropython就是一個面向嵌入式的python變種)∠闯觯可以說python已經(jīng)聚集了一大批的人才图谷,并且已經(jīng)形成了強大的社區(qū),這給python提供了強大的后盾菠镇。
為了滿足智能合約對安全性的要求承璃,還是要對python作出諸多的修改,以限制python在智能合約中的行為隘梨,具體如下:
- 不允許python智能合約代碼訪問文件系統(tǒng)舷嗡。
- 如果允許智能合約代碼訪問文件,那么智能合約就具有有破壞系統(tǒng)的能力税稼,所以文件系統(tǒng)的訪問是絕對要禁止掉的垮斯。
- 限制python智能合約的內(nèi)存使用。
- 如果允許智能合約訪問無限制的內(nèi)存兜蠕,那么惡意的代碼就會消耗光系統(tǒng)的內(nèi)存抛寝,造成系統(tǒng)的運行緩慢甚至崩潰,所以對內(nèi)存也必須作出限制晶府,原來的cpython要實現(xiàn)這個目標(biāo)還有點小麻煩,但是改用micropython后一卻都變得非常的簡單川陆,只要設(shè)定gc允許使用的內(nèi)存就可以了较沪。
1鳞绕、 限制python智能合約的執(zhí)行時間
這點也很好解釋们何,如果不作限制,惡意的代碼可以輕易的制造一個死循環(huán)控轿,占用大量的CPU資源冤竹,讓其它智能合約得不到執(zhí)行,產(chǎn)生不了新的區(qū)塊茬射,并造成整個區(qū)塊鏈系統(tǒng)的崩潰贴见。目前的執(zhí)行時間檢測是在bytecode級別的,已經(jīng)做到了非常的實時躲株,但是仍然需要考慮針對一些可能比較耗時的C代碼作進一步的優(yōu)化片部,因為python最終調(diào)用的是C代碼,有可能在解釋執(zhí)行某個bytecode的時候會消耗大量的CPU資源霜定,而目前的檢測機制還沒有考慮到這點档悠。
2、只允許import指定的模塊望浩,避免一些不安全的模塊對系統(tǒng)造成危險辖所,將安全問題控制在最小范圍內(nèi)。
3磨德、不允許調(diào)用exec酥宴,eval這些執(zhí)行代碼的函數(shù)拙寡。
如果允許智能合約調(diào)用自定義代碼,那么將是非常危險的诚啃,惡意的智能合約可以通過加解密的方法來偽裝惡意的代碼始赎,從而使惡意代碼的分析和檢測變得困難胃碾。顯然仆百,在智能合約中,這種情況顯然是不允許發(fā)生的峦朗,所以必須杜絕惡意代碼通過這種方式來攻擊系統(tǒng)。
雖然以上的限制已經(jīng)對python智能合約提供了比較完整的支持尺铣,但是并不能保證惡意的python智能合約代碼完全不會對系統(tǒng)造成破壞。一個系統(tǒng)不論是多么的完善店溢,終歸是有漏洞的地方。盡管micropython已經(jīng)被大量使用叠赦,解釋器也已經(jīng)很成熟了,但是相對來說仍然是比較復(fù)雜的,并且micropython并不是一種專門為智能合約而設(shè)計的語言效拭,仍然存在是一些非可控的因素慕的,但是這并不能成為我們不用python的理由肮街。目前,已經(jīng)有了完善的對python代碼進行sandboxing的方案绕辖,例如 可以將python代碼的執(zhí)行放到一個如docker這樣的虛擬機中執(zhí)行。所以弟头,在python代碼的安全性方便,也不必過于擔(dān)心伦连。害怕問題的產(chǎn)生是沒有用也是沒有必要的,因為對策總是有的歧焦,要的只是選出一個最優(yōu)的方案绢馍。將來也會對pyeos的python智能合約的代碼的運行機制進行進一步的完善你稚。
當(dāng)然,除了上面的措施之外,在人方面盈滴,設(shè)立獎罰機制。對發(fā)現(xiàn)系統(tǒng)漏洞的開發(fā)者以適當(dāng)?shù)莫剟盥髡叮瑢阂庵悄芎霞s代碼提供檢出機制,加大作惡的成本瀑梗,使作惡的成本大于收益等等方面的措施谤职,也是很有必要的。
python作為智能合約的優(yōu)勢明顯,并不能因為擔(dān)心python的安全性就棄之不用凤跑。實際上褐奥,任何的智能合約都有其要面對的安全性問題儿倒,我們要做的是發(fā)現(xiàn)問題,解決問題凰慈,并作好解決未知問題的準(zhǔn)備输钩。