以太坊智能合約
在介紹以太坊相關(guān)內(nèi)容的時候,智能合約是最為重要的一塊延塑,以太坊中的智能合約讓區(qū)塊鏈從比特幣1.0羞福,步入到區(qū)塊鏈2.0,更多的應(yīng)用可以基于以太坊平臺開發(fā)出現(xiàn)狂秦。
智能合約
現(xiàn)實生活中的合約灌侣,一般一式幾份,給與合約的簽署方裂问,然后根據(jù)紙質(zhì)合約執(zhí)行合約條款侧啼。在講到智能合約的時候,明確一個概念“代碼即規(guī)則”堪簿。那么基于這個原則痊乾,智能合約就類似一個代理人的角色,在區(qū)塊鏈上智能合約就是:合約代碼+存儲空間的虛擬賬戶椭更。?
智能合約中的行為由code(代碼)來控制哪审,那么智能合約的賬戶存儲合約的狀態(tài)。在以太坊上核心就是EVM(以太坊虛擬機)虑瀑,合約代碼的執(zhí)行都在EVM中進行湿滓。當(dāng)然每個節(jié)點都會有一個EVM,EVM是一個圖靈完備的虛擬機舌狗。(想了解圖靈完備可以參考磨鏈社區(qū)的相關(guān)輸出)
EVM簡介
EVM是圖靈完備虛擬機器叽奥。EVM存在而典型圖靈完備機器不存在的唯一限制就是EVM本質(zhì)上是被gas束縛。因此痛侍,可以完成的計算總量本質(zhì)上是被提供的gas總量限制的朝氓。EVM具有基于堆棧的架構(gòu)。堆棧機器 就是使用后進先出來保存臨時值的計算機恋日。
EVM的存儲方式有三種:
棧(Stack)
賬戶存儲(Storage)
內(nèi)存(Memory)
有一定計算機基礎(chǔ)的應(yīng)該理解膀篮。棧是常見的線性數(shù)據(jù)結(jié)構(gòu),先進后出的模式岂膳。EVM基于棧的虛擬機誓竿,那么所有的運算都在棧上,一個棧之前提到是256bit谈截。賬戶存儲和內(nèi)存將EVM的賬戶存儲和內(nèi)存類比成我們通晨曷牛看到的計算機的硬盤和內(nèi)存涧偷。
EVM中每個堆棧項的大小為256bit,堆棧有一個最大的大小毙死,為1024bit燎潮。
EVM有內(nèi)存,項目按照可尋址字節(jié)數(shù)組來存儲扼倘。內(nèi)存是易失性的确封,也就是數(shù)據(jù)是不持久的。
EVM也有一個存儲器再菊。不像內(nèi)存爪喘,存儲器是非易失性的,并作為系統(tǒng)狀態(tài)的一部分進行維護纠拔。EVM分開保存程序代碼秉剑,在虛擬ROM 中只能通過特殊指令來訪問。這樣的話稠诲,EVM就與典型的馮·諾依曼架構(gòu) 不同侦鹏,此架構(gòu)將程序的代碼存儲在內(nèi)存或存儲器中。
EVM同樣有屬于它自己的語言:“EVM字節(jié)碼”臀叙,當(dāng)一個程序員比如你或我寫一個在以太坊上運行的智能合約時略水,我們通常都是用高級語言例如Solidity來編寫代碼。然后我們可以將它編譯成EVM可以理解的EVM字節(jié)碼劝萤。(摘自以太坊工作原理)
那么問題來了聚请,代碼在EVM中執(zhí)行,以太坊網(wǎng)絡(luò)中每個節(jié)點都有一個EVM稳其,的確是每個節(jié)點的EVM都會去工作,必須通過在EVM中執(zhí)行代碼來驗證區(qū)塊的結(jié)果狀態(tài)炸卑。這樣通常理解就是大量的計算資源的浪費既鞠,那么從安全性的方面來考慮,在一個去中介化的區(qū)塊鏈系統(tǒng)中盖文,這個是保證整體的安全性的必要操作嘱蛋。當(dāng)然每個節(jié)點在執(zhí)行過程中會出現(xiàn)不同的情況,但是在區(qū)塊鏈系統(tǒng)中必須要達到完全的一致五续,這就使得EVM和智能合約存在一定的局限性洒敏。出現(xiàn)不確定的結(jié)果無法達成共識。這種場景下必須再次同步區(qū)塊達成一致性疙驾。
指令集
EVM有專門的指令集凶伙,包括了一般常見的算術(shù)運算、位運算它碎、邏輯運算函荣、條件判斷等显押,針對區(qū)塊鏈架構(gòu)還要專門的合約訪問區(qū)塊號,區(qū)塊時間戳等指令傻挂。所有的指令以256bit位單位來傳遞乘碑。智能合約的編譯就是講高級語言寫的代碼編譯為指令集字節(jié)碼。
消息調(diào)用
以太坊中在合約執(zhí)行過程中通過創(chuàng)建消息的方式來調(diào)用其他合約金拒。?
簡述消息調(diào)用過程:
智能合約A發(fā)送一條消息(內(nèi)容:發(fā)送者兽肤、接收者、value绪抛、Gas等相關(guān)信息)給智能合約B资铡,消息的格式和交易很類似。區(qū)別在于消息使用call指令睦疫,在區(qū)塊鏈中不產(chǎn)生一個交易的記錄害驹。
智能合約B收到消息,訪問消息的數(shù)據(jù)區(qū)去獲取參數(shù)蛤育,執(zhí)行合約的代碼宛官。
智能合約B執(zhí)行后結(jié)果返回給智能合約A。
智能合約A把智能合約B返回消息單獨放在一塊內(nèi)存空間瓦糕。
代理調(diào)用
只從目標(biāo)合約去獲取代碼并執(zhí)行底洗,不改變當(dāng)前的環(huán)境。使得智能合約在運行過程中動態(tài)從其他地址加載代碼咕娄。
區(qū)塊鏈中智能合約的優(yōu)點
智能合約在區(qū)塊鏈中有著革命性的作用亥揖,那么合約上鏈后和傳統(tǒng)的合約對比有如下優(yōu)點:
代碼即規(guī)則,代碼邏輯明確圣勒,合約內(nèi)容規(guī)則更加明確费变。
區(qū)塊鏈網(wǎng)絡(luò)中節(jié)點互相獨立,那么需要形成共識后寫入圣贸,整個過程中記錄不可篡改挚歧,那么區(qū)塊鏈保存了合約的執(zhí)行記錄,整個過程明確可追溯吁峻。且合約的執(zhí)行力可以依賴區(qū)塊鏈協(xié)議強力保證滑负。
智能合約執(zhí)行流程
合約創(chuàng)建流程具體內(nèi)容
創(chuàng)建合約編寫智能合約
編譯智能合約代碼編譯成字節(jié)碼
部署把字節(jié)碼部署到區(qū)塊鏈網(wǎng)絡(luò)中
格式from:發(fā)起者、to:空用含、value:數(shù)值矮慕、data:字節(jié)碼、signature:簽名
調(diào)用發(fā)起交易調(diào)用合約
格式from:發(fā)起者啄骇、to:SC地址痴鳄、value:數(shù)值、data:方法調(diào)用肠缔、signature:簽名
智能合約語言Solidity
它的語法接近于Javascript夏跷,是一種面向?qū)ο蟮恼Z言哼转。但作為一種真正意義上運行在網(wǎng)絡(luò)上的去中心合約,它又有很多的不同槽华,下面列舉一些:?
以太坊底層是基于帳戶壹蔓,而非UTXO的,所以有一個特殊的Address的類型猫态。用于定位用戶佣蓉,定位合約,定位合約的代碼(合約本身也是一個帳戶)亲雪。?
由于語言內(nèi)嵌框架是支持支付的勇凭,所以提供了一些關(guān)鍵字,如payable义辕,可以在語言層面直接支持支付虾标,而且超級簡單。?
存儲是使用網(wǎng)絡(luò)上的區(qū)塊鏈灌砖,數(shù)據(jù)的每一個狀態(tài)都可以永久存儲璧函,所以需要確定變量使用內(nèi)存,還是區(qū)塊鏈基显。?
運行環(huán)境是在去中心化的網(wǎng)絡(luò)上蘸吓,會比較強調(diào)合約或函數(shù)執(zhí)行的調(diào)用的方式。因為原來一個簡單的函數(shù)調(diào)用變?yōu)榱艘粋€網(wǎng)絡(luò)上的節(jié)點中的代碼執(zhí)行撩幽,分布式的感覺库继。?
最后一個非常大的不同則是它的異常機制,一旦出現(xiàn)異常窜醉,所有的執(zhí)行都將會被回撤宪萄,這主要是為了保證合約執(zhí)行的原子性,以避免中間狀態(tài)出現(xiàn)的數(shù)據(jù)不一致榨惰。