以太坊中的智能合約

以太坊智能合約

在介紹以太坊相關(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ù)不一致榨惰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雨膨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子读串,更是在濱河造成了極大的恐慌,老刑警劉巖撒妈,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恢暖,死亡現(xiàn)場離奇詭異,居然都是意外死亡狰右,警方通過查閱死者的電腦和手機杰捂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棋蚌,“玉大人嫁佳,你說我怎么就攤上這事挨队。” “怎么了蒿往?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵盛垦,是天一觀的道長。 經(jīng)常有香客問我瓤漏,道長腾夯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任蔬充,我火速辦了婚禮蝶俱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饥漫。我一直安慰自己榨呆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布庸队。 她就那樣靜靜地躺著积蜻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皿哨。 梳的紋絲不亂的頭發(fā)上浅侨,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機與錄音证膨,去河邊找鬼如输。 笑死,一個胖子當(dāng)著我的面吹牛央勒,可吹牛的內(nèi)容都是我干的不见。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼崔步,長吁一口氣:“原來是場噩夢啊……” “哼稳吮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起井濒,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤灶似,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瑞你,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酪惭,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年者甲,在試婚紗的時候發(fā)現(xiàn)自己被綠了春感。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鲫懒,靈堂內(nèi)的尸體忽然破棺而出嫩实,到底是詐尸還是另有隱情,我是刑警寧澤窥岩,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布甲献,位于F島的核電站,受9級特大地震影響谦秧,放射性物質(zhì)發(fā)生泄漏竟纳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一疚鲤、第九天 我趴在偏房一處隱蔽的房頂上張望锥累。 院中可真熱鬧,春花似錦集歇、人聲如沸桶略。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽际歼。三九已至,卻和暖如春姑蓝,著一層夾襖步出監(jiān)牢的瞬間鹅心,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工纺荧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旭愧,地道東北人。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓宙暇,卻偏偏與公主長得像输枯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子占贫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容