版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第六章
智能合約層主講:XXX輔導(dǎo):XXX課程簡介01.智能合約的概述03.智能合約的應(yīng)用02.智能合約的特點04.比特幣智能合約05.以太坊智能合約1智能合約的概述一智能合約的概述什么是智能合約
生活中我們經(jīng)常用到合約:雙方或者多方為了保障一個交易的正常進行,簽署合約以文字的形式約定交易流程,明確各自的權(quán)利和義務(wù)。如:商品的交付方式,付款方式和時間等。當交易出現(xiàn)糾紛時,可以將合約作為證據(jù),訴諸法院等第三方機構(gòu)進行調(diào)解或者仲裁,保護相關(guān)方的利益。雖然合約在交易中能夠起到一定的保障作用,但也存在一些不足。首先,合約不具備內(nèi)在的強制執(zhí)行力,如果一方違約,如商品不符合約定或者買家拒絕付款,只能將合約提交至第三方機構(gòu)申請強制執(zhí)行,所需時間難以預(yù)期。此外,合約語言文字上的模糊、歧義等也使其約束力大大降低。因此,傳統(tǒng)合約在自動化執(zhí)行程度、違約懲罰能力、執(zhí)行時間約束等各方面存在先天性缺陷。我們需要一個一個理想化的交易代理,存儲所有交易規(guī)則并確??尚?、公正、安全地執(zhí)行,同時保護買家和賣家的利益。如:代理保存賣家的商品、向買家收款并向其發(fā)貨。如果買家未按約定付款則拒絕發(fā)貨,如果賣家未提供商品則向買家退款。智能合約是以區(qū)塊鏈技術(shù)為基礎(chǔ),實現(xiàn)可信、公正交易代理的系統(tǒng)。如圖6-1所示,智能合約可以視為區(qū)塊鏈上的一個特殊賬戶,具有兩個基本元素:合約存儲與合約代碼。合約存儲保存了合約的所有狀態(tài)信息,如商品庫存數(shù)量、交易記錄、用戶賬戶余額等,而合約代碼則以計算機程序的形式表示交易的流程和規(guī)則。一智能合約的概述智能合約示例一智能合約的概述
交易流程該系統(tǒng)的交易過程如下:(1)補貨:買家將商品保存在智能合約的存儲空間中,這里的商品既可以是數(shù)字商品,也可以是實物商品的電子化記錄。(2)代理交易:智能合約作為賣家的代理與買家交易。買家調(diào)用智能合約并發(fā)送約定數(shù)量的電子貨幣,智能合約將商品交付買家并保存交易憑證。(3)收款:買家調(diào)用智能合約,將買家支付的電子貨幣轉(zhuǎn)給自己。智能合約將所有功能以代碼的方式實現(xiàn),連同合約存儲一起保存在區(qū)塊鏈上,并分配一個獨一無二的地址,任何獲得該地址的用戶均可以調(diào)用智能合約參與交易。2智能合約的特點二智能合約的特點
與傳統(tǒng)的合約不同,智能合約中代理的行為是由代碼控制的,并且能夠使用區(qū)塊鏈提供的優(yōu)秀特性,實現(xiàn)傳統(tǒng)合約不具備的優(yōu)點:(1)交易行為的原子性。智能合約的交易過程,發(fā)貨和付款兩個行為被視為一個 具有原子性的“事務(wù)”,要么全部執(zhí)行完成,要么一個也不執(zhí)行,不會出現(xiàn)付款收不到商品或者發(fā)貨收不到貨款的情況。(2)合約內(nèi)容的明確性。合約由計算機編程語言編寫,運行結(jié)果具有確定性、唯一性,能夠避免傳統(tǒng)合約中使用自然語言可能存在的歧義。(3)交易過程的不可篡改性。智能合約部署在區(qū)塊鏈上,每個全節(jié)點均保存一份內(nèi)容同樣的副本。合約被調(diào)用時,網(wǎng)絡(luò)中所有全節(jié)點都會運行被調(diào)用的合約代碼,產(chǎn)生相同的運行結(jié)果、保存相同的永久交易憑證。因此合約執(zhí)行是所有全節(jié)點的“共識”,其安全性可以規(guī)約到區(qū)塊鏈系統(tǒng)的安全性,不超過半數(shù)的敵手發(fā)起的合謀攻擊無法對智能合約進行篡改。(4)合約執(zhí)行的強制性。智能合約的交易條款由合約代碼規(guī)定,合約調(diào)用時由區(qū)塊鏈節(jié)點自動執(zhí)行,因此具備強制性,交易參與方(賣家或者買家)無法阻止交易執(zhí)行過程。二智能合約的特點
智能合約部署時,向區(qū)塊鏈網(wǎng)絡(luò)上的每一個全節(jié)點分發(fā)一份副本。合約被調(diào)用時,每個全節(jié)點執(zhí)行被調(diào)用的代碼,更新合約存儲,并在區(qū)塊打包時將合約包含在其中。一個隨之而來的問題是需要確保這些節(jié)點在運行相同的代碼時,必須產(chǎn)生嚴格確定性的、一致的運行結(jié)果。一些特殊的操作,如生產(chǎn)隨機數(shù)、調(diào)用系統(tǒng)API等,在不同的計算機上可能返回不同的結(jié)果,會破壞智能合約交易的一致性。因此,區(qū)塊鏈系統(tǒng)中,一般使用虛擬機技術(shù)來消除底層軟硬件系統(tǒng)不同造成的運行環(huán)境差異。此外,智能合約部署在所有全節(jié)點上,每個全節(jié)點都需要保存合約代碼與合約存儲,合約調(diào)用發(fā)生時,所有全節(jié)點平行化地執(zhí)行相應(yīng)地代碼,造成了大量的算力與存儲空間冗余。但這也是為了獲得共識、不可篡改性等安全性要求必須做出的折中。3智能合約的應(yīng)用三智能合約的應(yīng)用
02政務(wù)03供應(yīng)鏈金融0104產(chǎn)權(quán)05保險三智能合約的應(yīng)用
金融
在傳統(tǒng)金融服務(wù)中,所有操作流程高度依賴人工參與,整個過程需要耗費較高的人力成本,區(qū)塊鏈智能合約能夠?qū)崿F(xiàn)數(shù)字身份權(quán)益保護、財務(wù)數(shù)據(jù)文件數(shù)字化記錄、股權(quán)支付分割及債務(wù)自動化管理、場外衍生品交易處理過程優(yōu)化、財務(wù)所有權(quán)轉(zhuǎn)移等方面應(yīng)用,讓整個流程減少人工操作成本和錯誤,同時提高效率及透明度。利用區(qū)塊鏈和智能合約,不僅可以精確記錄財務(wù)數(shù)據(jù),還可以用來管理抵押、資產(chǎn)管理、付款、結(jié)算等多種業(yè)務(wù)。例如:在貸款業(yè)務(wù)中,可以利用智能合約進行抵押、自動化放款以及還款后自動解押等多種流程的自動化實現(xiàn)。并且有助于實現(xiàn)整個流程的公開、透明,強化跟蹤管理。三智能合約的應(yīng)用
政務(wù)
區(qū)塊鏈去中心化、不可篡改、可信任、可追溯的特性,能夠優(yōu)化政府的工作流程,如通過建立去中心化、自治的系統(tǒng)應(yīng)用,在智能合約完成基礎(chǔ)建設(shè)后,通過系統(tǒng)自動化管理,在觸發(fā)設(shè)定的條件時,自動完成自治行為,如移除成員、添加成員、分配資金,審批流程等等。三智能合約的應(yīng)用
供應(yīng)鏈
供應(yīng)鏈涉及幾個基本流程,例如從各個供應(yīng)商處購買產(chǎn)品,將其存儲在倉庫中,下訂單,包裝所需產(chǎn)品并將其運輸?shù)搅闶凵袒蚩蛻簟9?yīng)鏈管理是許多智能鏈用例之一,可以使供應(yīng)鏈更加透明和高效。供應(yīng)鏈程序中的每個動作都可以編碼為智能合約??梢詫崟r跟蹤從工廠到零售商店貨架的每個階段的產(chǎn)品,可以認證已交付產(chǎn)品的來源,減少對供應(yīng)鏈流程進行人工干預(yù)的需求。三概率論和數(shù)理統(tǒng)計的應(yīng)用
產(chǎn)權(quán)
智能合約可以用于財產(chǎn)所有權(quán)的交易和轉(zhuǎn)移。首先,財產(chǎn)所有權(quán)可以使用去中心化的方式記錄在區(qū)塊鏈上,并利用智能合約實現(xiàn)自動化交易。設(shè)置一定的觸發(fā)條件,通過智能合約判斷條件是否滿足,并實現(xiàn)自動化的財產(chǎn)所有權(quán)轉(zhuǎn)移。例如跨境采購中,可以避免耗時的談判,繁瑣的文檔編制和復(fù)雜的交易程序。同樣,智能合約也可用于知識產(chǎn)權(quán)交易,財產(chǎn)所有人可以保留作品的電子化所有權(quán)證明,使用智能合約聲明所有權(quán)使用的條件和應(yīng)當支付的報酬,每當有人使用他們的作品時,觸發(fā)智能合約對使用行為進行記錄,并進行自動化付款。三概率論和數(shù)理統(tǒng)計的應(yīng)用
保險
傳統(tǒng)的保險理賠需要復(fù)雜的流程,從證據(jù)采集,文書流轉(zhuǎn),到審核、賠付,整個過程主要以人工完成,通常需要數(shù)周甚至數(shù)月的時間,不但耗費大量資源,而且存在人為疏漏造成錯誤的可能?;谖锫?lián)網(wǎng)、區(qū)塊鏈和智能合約等技術(shù),可以實現(xiàn)多種場景下的保險理賠自動化處理。如在車輛保險中,車聯(lián)網(wǎng)通過安裝在車輛上的傳感器感知交通事故的發(fā)生,采集事故時間、位置及其它數(shù)據(jù)作為證據(jù)通過網(wǎng)絡(luò)上傳至區(qū)塊鏈,車主、保險公司、交通管理部門等各方通過區(qū)塊鏈實現(xiàn)安全、公開、不可篡改的數(shù)據(jù)分享,將理賠條件、流程寫入智能合約,進行多方、無中心的自動化事故處理和保險理賠。4比特幣智能合約四比特幣智能合約
比特幣系統(tǒng)具有編程腳本的功能,實現(xiàn)了基于計算機程序驗證數(shù)字貨幣所有權(quán)的轉(zhuǎn)移機制。一筆交易的完成,是通過比特幣節(jié)點運行內(nèi)置的腳本程序來實現(xiàn)的。通過編寫適當?shù)哪_本可以構(gòu)造成一些特定的支付條件,實現(xiàn)多種智能合約的功能,如多重簽名支付、交易鎖定期、保證合同、擔(dān)保與爭端調(diào)解等。因此,比特幣具有在一定程度上支持智能合約的能力,并被稱為“可編程的貨幣”。但是,比特幣腳本只能在堆棧上運行,支持的虛擬機指令非常有限,也沒有循環(huán)、條件跳轉(zhuǎn)等指令,不是圖靈完備的語言,難以支撐復(fù)雜的智能合約應(yīng)用。
在比特幣系統(tǒng)中,每一筆交易都擁有一個或多個輸入和一個或多個輸出,基于未花費的交易輸出UTXO(UnspentTransactionOutput)實現(xiàn)[1]。即:每一筆交易的輸入,都是基于上一筆交易未被花費的輸出。通過這種方式數(shù)字貨幣從一個地址轉(zhuǎn)移到另一個地址,形成了一條所有權(quán)鏈。但是比特幣系統(tǒng)沒有賬戶的概念,需要確保交易支付的數(shù)字貨幣不被合法接收方之外的攻擊者冒名獲取。如:在上一筆交易中,Alice給Bob支付了0.1個BTC,當Bob花費這0.1個BTC時應(yīng)該能夠證明自己擁有這個UTXO,并且其他人無法通過假冒Bob花費這個UTXO。比特幣系統(tǒng)使用內(nèi)置的腳本程序解決這個問題。每一個交易中都包含輸入記錄和輸出記錄。輸入記錄不但包括對前一個交易輸出部分的引用,指明該交易花費的數(shù)字貨幣的來源,而且包含一段腳本代碼,稱為解鎖腳本,只有合法接收者才能按照腳本約定出示相應(yīng)信息(鎖的“鑰匙”),獲得UTXO。在每條輸出記錄中也包含一段鎖定腳本,由交易發(fā)起者給出,用于指定接收者,能夠提供相匹配信息的用戶才能夠解鎖。四比特幣智能合約
在比特幣系統(tǒng)中,每一筆交易都擁有一個或多個輸入和一個或多個輸出,基于未花費的交易輸出UTXO(UnspentTransactionOutput)實現(xiàn)[1]。即:每一筆交易的輸入,都是基于上一筆交易未被花費的輸出。通過這種方式數(shù)字貨幣從一個地址轉(zhuǎn)移到另一個地址,形成了一條所有權(quán)鏈。但是比特幣系統(tǒng)沒有賬戶的概念,需要確保交易支付的數(shù)字貨幣不被合法接收方之外的攻擊者冒名獲取。如:在上一筆交易中,Alice給Bob支付了0.1個BTC,當Bob花費這0.1個BTC時應(yīng)該能夠證明自己擁有這個UTXO,并且其他人無法通過假冒Bob花費這個UTXO。比特幣系統(tǒng)使用內(nèi)置的腳本程序解決這個問題。每一個交易中都包含輸入記錄和輸出記錄。輸入記錄不但包括對前一個交易輸出部分的引用,指明該交易花費的數(shù)字貨幣的來源,而且包含一段腳本代碼,稱為解鎖腳本,只有合法接收者才能按照腳本約定出示相應(yīng)信息(鎖的“鑰匙”),獲得UTXO。在每條輸出記錄中也包含一段鎖定腳本,由交易發(fā)起者給出,用于指定接收者,能夠提供相匹配信息的用戶才能夠解鎖。四比特幣智能合約
收到一個交易后,比特幣網(wǎng)絡(luò)上的礦工節(jié)點會驗證交易的發(fā)起者是否合法地擁有需要支付的比特幣。用Alice和Bob的例子來說明這個過程:假設(shè)Bob已經(jīng)從Alice那里獲得了0.1個btc,相應(yīng)的交易記為TX_1,其輸出記為
TX_1_OUT_1
,在交易中Alice指定了一個只能由接收者Bob打開的“鎖”,由于這把“鎖”的存在,除Bob外的所有人無法使用這個比特幣(圖6-2)。假設(shè)Bob要將這0.1個Btc支付給Joe時,他構(gòu)建一個新的交易記錄TX_2,在TX_2輸入記錄中包含了對之前交易輸出
TX_1_OUT_1
的引用,以及一段用Bob的私鑰簽名過的“鑰匙”(解鎖腳本);在交易TX_2的輸出記錄TX_2_OUT_1中,不但包含本次支付的比特幣數(shù)量0.1BTC,Bob還需要設(shè)置一個只有接收人Joe才能開啟的“鎖”(另一個鎖定腳本)。這個新的交易TX_2被Bob發(fā)送給礦工,只有通過了礦工對解鎖腳本有效性的驗證后,這筆交易才會被記錄到鏈上賬本中。此時也意味著Bob完成了一個接收+花費比特幣的典型場景。此時,輸出
TX_1_OUT_1
由于被TX_2中的輸入成功使用,會被系統(tǒng)被標記為已花出。如果嘗試利用它再次構(gòu)建交易,會被礦工認定為“雙花”從而拒絕。與之相對,輸出
TX_2_OUT_1
由于尚未被任何輸入使用,故被稱為未花費輸出(即UTXO)。圖6-2鎖定腳本和解鎖腳本四比特幣智能合約
比特幣底層使用腳本編程語言來實現(xiàn)“鎖”和“鑰匙”的功能。比特幣的腳本語言是一種基于棧的,并且定義了由操作碼(opcode)組成的指令集合,如:OP_2表示將數(shù)值2推至棧頂,OP_ADD表示將棧頂?shù)膬蓚€元素相加,OP_EQUAL表示如果棧頂上2個元素相等,則返回
true;否則返回
false。比特幣虛擬機(BVM)被引入比特幣節(jié)點。BVM將鎖定腳本連接在解鎖腳本的后面,從而形成完整的執(zhí)行腳本。這個完整的腳本會被BVM執(zhí)行。當執(zhí)行完畢后,如果棧頂元素的布爾值為
true,則認為腳本執(zhí)行成功,反之其他情況則認為腳本執(zhí)行失敗。在Alice給Bob支付0.1個BTC的交易TX1中,Alice創(chuàng)建的輸出腳本類似于如下的格式:
OP_DUPOP_HASH160abcd1234…9876OP_EQALVERIFYOP_CHECKSIG其中,OP_DUP、OP_HASH160、OP_EQALVERIFY、OP_CHECKSIG分別表示復(fù)制、哈希、檢查是否相等和簽名校驗操作,abcd1234…9876是Bob的公鑰的哈希值。這個腳本的作用是:如果一個用戶能夠出示一個哈希值為abcd1234…9876的公鑰,同時出示一個與此公鑰對應(yīng)的私鑰生成的簽名,就能證明自己是這0.1個BTC的合法擁有者。在Alice生成交易輸出時,嵌入的abcd1234…9876是Bob的公鑰的哈希值,Bob不但擁有該公鑰/私鑰對,可以用私鑰生成合法簽名。Bob之外的攻擊者雖然也可能獲得Bob的公鑰,但沒有相應(yīng)的私鑰,無法生成合法簽名,因此無法假冒Bob獲得這筆輸出。同時,任意礦工可以驗證簽名與公鑰是否匹配,從而驗證交易是否有效。四比特幣智能合約
比特幣底層使用腳本編程語言來實現(xiàn)“鎖”和“鑰匙”的功能。比特幣的腳本語言是一種基于棧的,并且定義了由操作碼(opcode)組成的指令集合,如:OP_2表示將數(shù)值2推至棧頂,OP_ADD表示將棧頂?shù)膬蓚€元素相加,OP_EQUAL表示如果棧頂上2個元素相等,則返回
true;否則返回
false。比特幣虛擬機(BVM)被引入比特幣節(jié)點。BVM將鎖定腳本連接在解鎖腳本的后面,從而形成完整的執(zhí)行腳本。這個完整的腳本會被BVM執(zhí)行。當執(zhí)行完畢后,如果棧頂元素的布爾值為
true,則認為腳本執(zhí)行成功,反之其他情況則認為腳本執(zhí)行失敗。在Alice給Bob支付0.1個BTC的交易TX1中,Alice創(chuàng)建的輸出腳本類似于如下的格式:
OP_DUPOP_HASH160abcd1234…9876OP_EQALVERIFYOP_CHECKSIG其中,OP_DUP、OP_HASH160、OP_EQALVERIFY、OP_CHECKSIG分別表示復(fù)制、哈希、檢查是否相等和簽名校驗操作,abcd1234…9876是Bob的公鑰的哈希值。這個腳本的作用是:如果一個用戶能夠出示一個哈希值為abcd1234…9876的公鑰,同時出示一個與此公鑰對應(yīng)的私鑰生成的簽名,就能證明自己是這0.1個BTC的合法擁有者。在Alice生成交易輸出時,嵌入的abcd1234…9876是Bob的公鑰的哈希值,Bob不但擁有該公鑰/私鑰對,可以用私鑰生成合法簽名。Bob之外的攻擊者雖然也可能獲得Bob的公鑰,但沒有相應(yīng)的私鑰,無法生成合法簽名,因此無法假冒Bob獲得這筆輸出。同時,任意礦工可以驗證簽名與公鑰是否匹配,從而驗證交易是否有效。四比特幣智能合約
礦工收到Bob的交易TX2時,為驗證交易的合法性,即確認Bob是否真正擁有他想要支付的0.1BTC,按如下步驟執(zhí)行:(1)找到Bob獲得此0.1BTC的交易TX1,將TX2的解鎖腳本和TX1的鎖定腳本按照如下方式連接;(2)在比特幣虛擬機中建立堆棧,從左至右地運行組合后的腳本。(3)將<sig>入棧;其中<sig>為Bob在TX2中用自己的私鑰生成的簽名;解鎖腳本和鎖定腳本的連接將sig入棧四比特幣智能合約
(4)將<PubK>入棧;其中<PubK>為Bob在TX2中出示的自己的公鑰;(5)OP_DUP復(fù)制棧頂元素,即復(fù)制<PubK>;(6)OP_HASH160執(zhí)行哈希操作,即計算<PubK>的哈希值;復(fù)制棧頂元素執(zhí)行哈希操作四比特幣智能合約
(7)將Alice在TX1中指定的接收人公鑰的哈希值abcd1234…9876放入棧頂;(8)執(zhí)行OP_EQALVERIFY操作,驗證棧頂兩個元素是否相等。即:Bob出示的公鑰的哈希值與Alice給出的公鑰哈希值是否一致,如果一致則從堆棧中移除這兩個元素,繼續(xù)執(zhí)行下面的腳本;(9)執(zhí)行OP_CHECKSIG,驗證Bob給出的簽名<sig>是否是由公鑰<PubK>相對應(yīng)的私鑰產(chǎn)生的。如果驗證通過則在棧頂放入True。驗證棧頂元素是否一致驗證簽名四比特幣智能合約
由于交易是通過腳本來實現(xiàn),腳本語言可以表達一些特定的條件,實現(xiàn)如下場景:多重簽名應(yīng)用:一個支付交易必須獲得多個用戶的簽名才能完成??梢詰?yīng)用在合伙企業(yè)中,限制超過半數(shù)的股東同意才能進行支付。擔(dān)保和爭端調(diào)解:兩個互不信任的用戶進行交易,當交易出現(xiàn)問題時,可由指定的第三方進行裁決,使用裁決者的簽名和裁定認可的一方共同簽名來兌現(xiàn)這筆交易。保證合同/集資:一個項目需要多個共同出資才能實施,籌集的資金達不到要求的項目取消,達到要求時每個集資用戶才真正地付款。5以太坊智能合約五以太坊智能合約與比特幣的腳本相比,以太坊提供了圖靈完備的智能合約,是一種比較大的進步。比特幣是數(shù)字資產(chǎn)作為價值的載體,而以太坊超越了數(shù)字資產(chǎn)屬性,賦能去中心化應(yīng)用,使得去中心化的全球分布式計算機變?yōu)榭赡?。?/p>
以太坊智能合約
5.1以太坊賬戶模型
智能合約是以太坊網(wǎng)絡(luò)上的一種特殊賬戶。以太坊賬戶分為兩類,用戶賬戶和智能合約賬戶。用戶賬戶包括兩個部分:賬戶地址和賬戶余額[3]。而智能合約賬戶包括如下項目:賬戶地址:和普通賬戶相同,是賬戶在以太坊網(wǎng)絡(luò)上的唯一識別符。賬戶余額:賬戶余額意味著智能合約可以擁有數(shù)字資產(chǎn),它可以用賬戶代碼對這些資產(chǎn)進行處理。合約代碼:智能合約的代碼是編譯好的字節(jié)代碼,在以太坊網(wǎng)絡(luò)節(jié)點上運行。合約代碼在智能合約創(chuàng)建時生成,包含可以調(diào)用的函數(shù)。狀態(tài)代碼:在智能合約中聲明的字段和變量,表示智能合約的當前狀態(tài)。它的工作方式與編程語言中類的字段變量相同,唯一的區(qū)別是這個對象是在以太坊節(jié)點中永久存在的。五
以太坊智能合約
5.1以太坊賬戶模型以太坊允許一個智能合約調(diào)用另一個智能合約,從而實現(xiàn)智能合約之間的轉(zhuǎn)賬等操作。下面的代碼給出了一個最簡單的智能合約的例子。上方代碼中,第1行定義了一個名為Counter的智能合約,第2行定義了一個無符號整數(shù)變量,該變量的值就是合約當前的狀態(tài)。第3~5行是智能合約的構(gòu)造函數(shù),對變量counter進行了初始化,然后在6~8行定義了一個函數(shù)count(),其功能是將變量進行自增操作,當該函數(shù)被調(diào)用時,所有人都能看到該智能合約在區(qū)塊鏈上的狀態(tài)將會加1。五
以太坊智能合約
5.1以太坊賬戶模型
如下圖所示,將智能合約部署到區(qū)塊鏈網(wǎng)絡(luò)上需要完成如下幾項任務(wù):(1)分配一個賬戶地址,如:0x16E0022b17B,(2)初始化賬戶余額;(3)上傳合約代碼;(4)初始化合約狀態(tài)變量。五
以太坊智能合約
5.2以太坊智能合約的調(diào)用
在比特幣系統(tǒng)中,用戶只能做一種類型的交易:轉(zhuǎn)賬。填寫to、from和amount三個字段,即誰來付錢,付給誰,付多少錢。這使比特幣成為一種數(shù)字現(xiàn)金的儲存和流通工具,在用戶之間實現(xiàn)價值的轉(zhuǎn)移。以太坊智能合約中,增加了一個“data”字段,支持如下三種類型的交易:五
以太坊智能合約
5.2以太坊智能合約的調(diào)用
具體操作的過程為:(1)轉(zhuǎn)賬:向一個以太坊地址發(fā)送一定數(shù)目的以太坊代幣,如以下代碼向賬戶‘0x687422…’進行轉(zhuǎn)賬,金額為0.0005:(2)創(chuàng)建智能合約創(chuàng)建智能合約是一種特殊的轉(zhuǎn)賬交易,其to字段為空,表示創(chuàng)建一份智能合約,DATA字段包含編譯過的智能合約字節(jié)碼。五
以太坊智能合約
5.2以太坊智能合約的調(diào)用
(3)調(diào)用合約智能合約的調(diào)用也以轉(zhuǎn)賬交易的方式進行,其中to字段表示智能合約賬戶的地址,DATA字段表示調(diào)用的智能合約函數(shù)名稱和函數(shù)的參數(shù)。五
以太坊智能合約
5.3智能合約執(zhí)行的成本Gas
當一個用戶發(fā)起某個智能合約的調(diào)用時,以太坊網(wǎng)絡(luò)中的所有全節(jié)點都會在自己的以太坊虛擬機(EVM)中運行被調(diào)用的智能合約,造成了大量重復(fù)的存儲空間和算力消耗。為了防止惡意用戶發(fā)起蓄意攻擊造成資源濫用,以太坊規(guī)定在智能合約的調(diào)用過程中,要對每個運算步驟收取一定的費用,“Gas”就是以太坊使用的收費單位,用來衡量一個指令或者動作需要耗費的計算機資源的數(shù)量,即俗稱的汽油費。如,一次乘法運算的價格是5個Gas,加法是3個Gas。同時,也需要對Gas本身指定以ether代幣為單位的價格。需要針對每次智能合約調(diào)用,需要給出每單位的Gas愿意支付的價格水平,即GasPrice。將愿意支付的Gas總量乘以指定的GasPrice,才是運行智能合約支付的全部費用。如果設(shè)定的GasPrice太低,那么沒有節(jié)點會在第一時間去運行該合約,造成調(diào)用不會被礦工優(yōu)先執(zhí)行并包括在區(qū)塊鏈中。gasprice可以使用建議的數(shù)值,目前約為5?21GWei(1GWei為109Wei或10-9Ether)。智能合約部署或者被調(diào)用時,Gas將從發(fā)起者的賬戶余額中扣除。
發(fā)起智能合約調(diào)用必須提供足夠的Gas,足以支付合約代碼執(zhí)行完畢所需的計算和存儲費用。代碼執(zhí)行完畢時剩余的Gas將會退還,但是如果調(diào)用者給出的Gas太少,造成智能合約代碼執(zhí)行結(jié)束之前Gas已經(jīng)消耗完畢,則礦工將會立即停止智能合約的運行,不再執(zhí)行剩余代碼,也不會退回已經(jīng)扣除的Gas五
以太坊智能合約
5.4以太坊虛擬機
以太坊網(wǎng)絡(luò)上的主機可能運行在不同的硬件平臺上,使用的操作系統(tǒng)也會有不同,但同一個智能合約在不同的節(jié)點上運行需要有確定的、相同的結(jié)果,不能因為系統(tǒng)架構(gòu)的差異破壞區(qū)塊鏈系統(tǒng)的一致性,因此需要使用一定的技術(shù)手段為智能合約創(chuàng)造一致的運行環(huán)境?,F(xiàn)有主流的區(qū)塊鏈架構(gòu)對智能合約執(zhí)行環(huán)境的設(shè)計主要分為兩種:虛擬機和容器。它們的作用都是在一個沙盒中執(zhí)行合約代碼,并對合約所使用的資源進行隔離和限制。虛擬機技術(shù)是指能夠像真實機器一樣執(zhí)行程序的計算機的軟件實現(xiàn),可以分為兩種類型:有些虛擬機會模擬出一個完整的物理計算機,比如VMware、Hyper-V等,可以在這些虛擬機上安裝操作系統(tǒng)和應(yīng)用程序;另一些虛擬機則只提供了硬件的抽象層,而與具體的底層硬件無關(guān),例如Java虛擬機。區(qū)塊鏈智能合約系統(tǒng)的設(shè)計中,很少會采用模擬完整物理計算機的模式,因為這種方式會消耗大量的資源并嚴重影響性能,且很難兼容不同的硬件架構(gòu)。絕大多數(shù)的區(qū)塊鏈會采用更加輕量級的虛擬機架構(gòu),例如以太坊開發(fā)了EVM,R3Corda則直接采用了JVM,還有一些區(qū)塊鏈采用了V8引擎——Google公司的Java引擎(虛擬機)。以太坊虛擬機是一種沙盒封裝、與物理機完全隔離的虛擬機,是智能合約的運行環(huán)境。運行在EVM中的代碼不僅無法直接訪問物理機文件系統(tǒng)、其他進程以及網(wǎng)絡(luò),同一個EVM中運行的多個智能合約之間的訪問也是受限的。五
以太坊智能合約
5.4以太坊虛擬機
以太坊虛擬機中有三種存儲的方式:賬戶存儲、內(nèi)存和棧。首先,每個賬戶具有一塊持久化的存儲區(qū)域,稱為賬戶存儲。這部分數(shù)據(jù)是以持久化的方式存儲在區(qū)塊鏈上,而不是在EVM的內(nèi)存中,因此它是非易失的,存儲內(nèi)容不會隨著合約調(diào)用的結(jié)束而丟失。該存儲是一個鍵-值對結(jié)構(gòu)的稀疏散列表,其中鍵和值的長度都是256位。賬戶存儲被持久性地保存在區(qū)塊鏈上。因為賬戶存儲需要在每個全節(jié)點上保留副本,存儲成本很高,修改一個非0值、將0值賦值為非0分別需要消耗5000和20000個單位的Gas。內(nèi)存是線性的,可按字節(jié)級尋址。每次合約調(diào)用時虛擬機分配一塊空白內(nèi)存區(qū)域,內(nèi)存耗盡時將按字進行擴展(每個字是256位)。EVM不限制最大內(nèi)存容量,但是擴容將消耗一定數(shù)量的gas,隨著內(nèi)存使用量的增長,其費用會以平方級別增高。與賬戶存儲不同,內(nèi)存是易失性的,智能合約運行結(jié)束后所占的內(nèi)存空間將被釋放,下一次調(diào)用又從新的空白內(nèi)存開始。因此,內(nèi)存一般只用來保存中間結(jié)果。與常見的個人計算機不同,以太坊虛擬機執(zhí)行運算不是基于寄存器的,而是基于棧的。棧以字為單位,每個字的長度為256位,棧最大有1024個元素。對棧的訪問只限于其頂端:將一個元素放入棧的頂部,或者從棧的頂部取出一個元素。棧是以太坊虛擬機的底層實現(xiàn)機制,在使用高級語言進行智能合約開發(fā)時,一般不會直接使用棧操作。五
以太坊智能合約
5.4一個智能合約在以太坊中的生命周期
(1)智能合約的創(chuàng)建[2]在以太坊中,支持使用多種智能語言編寫智能合約,如:Solidity語言、Serpent語言、LLL語言等。其中Solidity是使用最為廣泛的語言。使用高級語言編寫的源代碼無法直接在EVM中運行,需要編譯為字節(jié)碼。第一步:創(chuàng)建者編寫智能合約,編譯,打包為一個交易,并將其發(fā)送到以太坊網(wǎng)絡(luò)中。第二步:以太坊網(wǎng)絡(luò)上的節(jié)點接收到該交易,檢查交易的格式是否正確、驗證交易簽名是否有效,計算該交易可能消耗的Gas數(shù)量,并在區(qū)塊鏈上查詢創(chuàng)建者的賬戶余額是否有足夠的金額進行支付,如余額不足則返回一條錯誤信息。第三步:接收節(jié)點將創(chuàng)建智能合約的交易保存在存儲池中,通過以太坊網(wǎng)絡(luò)向其他節(jié)點廣播發(fā)送該交易,其他收到交易的節(jié)點重復(fù)第二步中的檢查和驗證過程。第四步:節(jié)點競爭記賬權(quán)并生成新的區(qū)塊。獲得記賬權(quán)的節(jié)點對存儲池中所有收到的合約創(chuàng)建相應(yīng)的合約賬戶、部署合約,生成合約賬戶的地址(基于發(fā)送者地址與隨機數(shù)生成),并將該地址發(fā)送給合約創(chuàng)建者。第五步:獲得記賬權(quán)的節(jié)點將新生成的區(qū)塊在區(qū)塊鏈網(wǎng)絡(luò)中傳播,其他節(jié)點接收到區(qū)塊后,檢查并驗證智能合約的正確性與合法性,并部署智能合約。五
以太坊智能合約
5.4一個智能合約在以太坊中的生命周期
(2)智能合約的調(diào)用第一步:調(diào)用者生成一個交易,其中to字段填入智能合約的賬戶地址。該交易被發(fā)送到以太坊網(wǎng)絡(luò)中。第二步:網(wǎng)絡(luò)上的全節(jié)點B收到該交易,檢查交易的格式是否正確,驗證簽名是否合法,并檢查交易中的gaslimit、gasprice字段,從發(fā)送方賬戶中扣除相應(yīng)的金額,如果余額不足,則返回一條錯誤信息,丟棄交易。第三步:接收節(jié)點將交易通過以太坊網(wǎng)絡(luò)轉(zhuǎn)發(fā)到其他節(jié)點,其他節(jié)點重復(fù)上步中的操作。第四步:全節(jié)點競爭記賬權(quán),獲得記賬權(quán)的節(jié)點在本地EVM上運行被調(diào)用的智能合約代碼,如果在代碼運行完畢之前,指定的GAS已經(jīng)消耗完,則停止運行,并將狀態(tài)恢復(fù)到運行之前,但不退回已經(jīng)消耗的GAS。第五步:接收節(jié)點將交易請求以及生成的區(qū)塊在以太坊網(wǎng)絡(luò)上傳播。收到區(qū)塊的節(jié)點檢查并驗證區(qū)塊,在自己的EVM上運行其中的智能合約,并將運行結(jié)果進行交叉比對,如果結(jié)果相同則同步自己的區(qū)塊鏈。五
以太坊智能合約
5.5智能合約示例--Helloworld
本節(jié)中給出了一個使用solidity語言編寫的簡單智能合約例子,從本例子可以學(xué)習(xí)智能合約的開發(fā)環(huán)境和創(chuàng)建、調(diào)用方法。例子合約實現(xiàn)了一個簡單的加密貨幣系統(tǒng),利用該合約任何人都可以發(fā)行自己的加密貨幣,并且允許用戶進行轉(zhuǎn)賬操作。合約代碼如下:五
以太坊智能合約
5.5智能合約示例--Helloworld五
以太坊智能合約
5.5智能合約示例--Helloworld
代碼的第1行中,pragmas告知編譯器如何處理源代碼的,這一行的含義是源代碼的運行環(huán)境是Solidity大于0.5.99版本,小于0.8.0版本。代碼的第3行中,聲明了一個名為Coin的智能合約。Solidity中合約的含義就是一組代碼(函數(shù)
)和數(shù)據(jù)(狀態(tài)
),它們位于以太坊區(qū)塊鏈的一個特定地址上。代碼第4行使用address
public
minter聲明了一個可以被公開訪問的
address
類型的狀態(tài)變量。
address
類型是一個160位的值,不允許任何算術(shù)操作,適合存儲合約地址或外部人員的密鑰對。關(guān)鍵字
public
自動生成一個函數(shù),允許你在這個合約之外訪問這個狀態(tài)變量的當前值。第5行的mapping函數(shù)建立一個鍵-值的對應(yīng)關(guān)系,可以通過鍵來查找值,類似于Python中的字典。這個映射的名字是balances,權(quán)限類型為public,鍵的類型是地址address,值的類型是整型uint。在接下來的“event
Sent(address
from,
address
to,
uint
amount);”這一行中,定義了一個事件(event)。在本例中,事件會在第23行,
send
函數(shù)的最后一行被發(fā)出。智能合約中,用戶界面可以監(jiān)聽區(qū)塊鏈上發(fā)送的事件,而不會耗費太多系統(tǒng)資源。一旦某個智能合約發(fā)出了一個事件,監(jiān)聽該事件的合約都將收到通知。第9行中的函數(shù)
Coin
是智能合約的構(gòu)造函數(shù),在創(chuàng)建合約時被自動運行,無法在事后調(diào)用。在構(gòu)造函數(shù)中,永久存儲創(chuàng)建合約的用戶的地址:
msg。該函數(shù)中的msg.sender
是函數(shù)調(diào)用者的來源地址。五
以太坊智能合約
5.5智能合約示例--Helloworld
最后,真正被用戶或其他合約所調(diào)用的,以完成本合約功能的方法是mint和send函數(shù)。mint函數(shù)中,require是判斷一個條件是否滿足的函數(shù)。如果該函數(shù)中給定的條件不滿足,則不再執(zhí)行后面的語句。即:mint要求調(diào)用者是合約創(chuàng)建者,否則不會執(zhí)行后面的轉(zhuǎn)賬操作。而send
函數(shù)可被任何人用于向他人發(fā)送幣,該函數(shù)首先檢查發(fā)送者賬戶中是否有充足的幣,然后進行轉(zhuǎn)賬操作??梢栽谝蕴坏脑诰€編譯環(huán)境remix中調(diào)試和運行該合約。Remix是以太坊官方開源的Solidity在線集成開發(fā)環(huán)境,可以使用Solidity語言在網(wǎng)頁內(nèi)完成以太坊智能合約的在線開發(fā)、在線編譯、在線測試、在線部署、在線調(diào)試與在線交互,訪問地址為/。在remix界面的左上角的添加功能,新建一個文件,文件名命名為coin.sol,并輸入代碼,如下圖所示:點擊左側(cè)下拉框,可以選擇不同的solidity版本。點擊編譯按鈕,即可自動編譯合約。點擊create,會在內(nèi)存中將該智能合約創(chuàng)建一個實例。五
以太坊智能合約
5.6HyperledgerFabric智能合約
在HyperledgerFabric中,智能合約稱為Chaincode,中文翻譯為鏈碼。鏈碼是用戶根據(jù)業(yè)務(wù)邏輯編寫的智能合約代碼,被部署在Fabric網(wǎng)絡(luò)節(jié)點上的Docker容器中,它是客戶端程序和Fabric之間的橋梁,可以被用戶在外部發(fā)起調(diào)用,負責(zé)與賬本之間的交互(圖6-14)[4]。鏈碼支持go、java等語言的開發(fā),目前,支持最為完善的是go語言。鏈碼可以分為系統(tǒng)鏈碼和普通鏈碼。智能合約通常指的是普通鏈碼,用于在區(qū)塊鏈應(yīng)用程序中實現(xiàn)業(yè)務(wù)邏輯,而系統(tǒng)鏈碼則是用于系統(tǒng)管理。與普通鏈碼需要獨立沙盒環(huán)境運行不同,系統(tǒng)鏈碼在peer服務(wù)啟動時隨peer節(jié)點注冊,同peer節(jié)點一起運行。五
以太坊智能合約
5.6HyperledgerFabric智能合約
(1)鏈碼的生存周期安裝:鏈碼在編寫完成后,需要部署在Fabric網(wǎng)絡(luò)中的peer節(jié)點上,同時注明版本號,完成安裝過程。實例化:在peer節(jié)點上安裝的鏈碼需要經(jīng)過實例化才能真正激活可用,實例化的過程包括鏈碼編譯、打包、封裝docker容器鏡像等步驟。調(diào)用:實例化后的鏈碼可以被用戶在peer外部進行遠程調(diào)用,充當用戶與賬本之間的橋梁,進行查詢、寫入等操作。調(diào)用包括invoke和Query查詢。升級:peer上的鏈碼具有可升級的特點,可以把更新版本的鏈碼通過install操作安裝到當前運行鏈碼的peer上。(2)鏈碼的調(diào)用和編寫以Hyperledgerfabric系統(tǒng)中自帶的一個示例網(wǎng)絡(luò)和鏈碼介紹鏈碼的常用操作(/chaincode/chaincode_example02/go/)。五
以太坊智能合約
5.6HyperledgerFabric智能合約
查詢賬本查詢賬本是利用鏈碼在賬本上執(zhí)行讀取操作。數(shù)據(jù)以鍵/值對的方式進行存儲,用戶可以查詢單個或者多個鍵,并在鍵上執(zhí)行復(fù)雜的檢索操作,如下圖所示,應(yīng)用程序通過網(wǎng)絡(luò)將查詢請求提交給鏈碼,鏈碼作為應(yīng)用程序的代理在賬本上執(zhí)行操作并返回結(jié)果五
以太坊智能合約
5.6HyperledgerFabric智能合約
查詢所有車輛的函數(shù)queryAllCars已經(jīng)編寫好,并放在query.js中,我們可以使用下面的命令,返回賬本中所有車輛的列表:nodequery.js返回的信息如下所示:五
以太坊智能合約
5.6HyperledgerFabric智能合約
返回了賬本中記錄的10輛汽車,每輛汽車存儲了顏色、生產(chǎn)廠商、型號、車主四項信息。其中CAR0~CAR9是鍵,車輛的屬性是值。下面使用代碼編輯軟件(如:vscode,atom等)打開query.js文件,查看其源代碼:代碼中定義了一些變量,例如通道的名字。具體查詢的語句如下所示:五
以太坊智能合約
5.6HyperledgerFabric智能合約
當我們運行該應(yīng)用時,它調(diào)用了peer上的fabcar鏈碼,運行了其中的queryAllCars函數(shù),這個函數(shù)不需要傳遞參數(shù)。查看rabric-samples下面的chaincode/fabca/go子目錄,打開fabcar.go源文件,可以看到還有其他幾個可用的函數(shù):initLegger,queryCAr,qureyAllCars,createCar,changeCarOwner。在源代碼中定位到queAllCars函數(shù),分析它與賬本的交互過程。五
以太坊智能合約
5.6HyperledgerFabric智能合約
代碼中定義了key的范圍,從car0到car999。下圖給出了應(yīng)用調(diào)用鏈碼中函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024屆海南省臨高縣新盈中學(xué)高三假期自主綜合能力測試(一)數(shù)學(xué)試題
- 餐飲住房合同
- 不動產(chǎn)買賣合同解除協(xié)議模板
- 畢業(yè)生就業(yè)協(xié)議書入戶地址
- 手術(shù)對骨骼健康的影響
- 防溺水模擬演練課件
- 山東省煙臺招遠市(五四制)2024-2025學(xué)年九年級上學(xué)期期中考試化學(xué)試題(含答案)
- 河北省石家莊市欒城區(qū)2024-2025學(xué)年七年級上學(xué)期期中生物學(xué)試題(含答案)
- 《化妝棉》規(guī)范要求
- 福建省泉州市安溪縣2024-2025學(xué)年高三上學(xué)期11月期中測評試題 數(shù)學(xué)(含解析)
- 大學(xué)生職業(yè)生涯規(guī)劃(師范類)
- 部編版四年級語文上冊課內(nèi)閱讀復(fù)習(xí)試題含答案全套
- 大學(xué)生就業(yè)指導(dǎo)-面試技巧課件
- 人教版八年級語文上冊《蘇州園林》評課稿
- 建設(shè)工程第三方質(zhì)量安全巡查標準
- 混凝土超聲檢測缺陷報告
- 楓橋式鄉(xiāng)鎮(zhèn)派出所事跡材料
- 燃氣鍋爐房安全風(fēng)險分級清單
- 牙體牙髓學(xué)課件 五年制牙髓病
- 教師個人成長檔案電子模板
- 工廠供配電系統(tǒng)的動力方案及選型原則
評論
0/150
提交評論