區(qū)塊鏈原理與實(shí)踐- 課件 第6章智能合約層_第1頁(yè)
區(qū)塊鏈原理與實(shí)踐- 課件 第6章智能合約層_第2頁(yè)
區(qū)塊鏈原理與實(shí)踐- 課件 第6章智能合約層_第3頁(yè)
區(qū)塊鏈原理與實(shí)踐- 課件 第6章智能合約層_第4頁(yè)
區(qū)塊鏈原理與實(shí)踐- 課件 第6章智能合約層_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第六章

智能合約層主講:XXX輔導(dǎo):XXX課程簡(jiǎn)介01.智能合約的概述03.智能合約的應(yīng)用02.智能合約的特點(diǎn)04.比特幣智能合約05.以太坊智能合約1智能合約的概述一智能合約的概述什么是智能合約

生活中我們經(jīng)常用到合約:雙方或者多方為了保障一個(gè)交易的正常進(jìn)行,簽署合約以文字的形式約定交易流程,明確各自的權(quán)利和義務(wù)。如:商品的交付方式,付款方式和時(shí)間等。當(dāng)交易出現(xiàn)糾紛時(shí),可以將合約作為證據(jù),訴諸法院等第三方機(jī)構(gòu)進(jìn)行調(diào)解或者仲裁,保護(hù)相關(guān)方的利益。雖然合約在交易中能夠起到一定的保障作用,但也存在一些不足。首先,合約不具備內(nèi)在的強(qiáng)制執(zhí)行力,如果一方違約,如商品不符合約定或者買(mǎi)家拒絕付款,只能將合約提交至第三方機(jī)構(gòu)申請(qǐng)強(qiáng)制執(zhí)行,所需時(shí)間難以預(yù)期。此外,合約語(yǔ)言文字上的模糊、歧義等也使其約束力大大降低。因此,傳統(tǒng)合約在自動(dòng)化執(zhí)行程度、違約懲罰能力、執(zhí)行時(shí)間約束等各方面存在先天性缺陷。我們需要一個(gè)一個(gè)理想化的交易代理,存儲(chǔ)所有交易規(guī)則并確??尚拧⒐?、安全地執(zhí)行,同時(shí)保護(hù)買(mǎi)家和賣(mài)家的利益。如:代理保存賣(mài)家的商品、向買(mǎi)家收款并向其發(fā)貨。如果買(mǎi)家未按約定付款則拒絕發(fā)貨,如果賣(mài)家未提供商品則向買(mǎi)家退款。智能合約是以區(qū)塊鏈技術(shù)為基礎(chǔ),實(shí)現(xiàn)可信、公正交易代理的系統(tǒng)。如圖6-1所示,智能合約可以視為區(qū)塊鏈上的一個(gè)特殊賬戶(hù),具有兩個(gè)基本元素:合約存儲(chǔ)與合約代碼。合約存儲(chǔ)保存了合約的所有狀態(tài)信息,如商品庫(kù)存數(shù)量、交易記錄、用戶(hù)賬戶(hù)余額等,而合約代碼則以計(jì)算機(jī)程序的形式表示交易的流程和規(guī)則。一智能合約的概述智能合約示例一智能合約的概述

交易流程該系統(tǒng)的交易過(guò)程如下:(1)補(bǔ)貨:買(mǎi)家將商品保存在智能合約的存儲(chǔ)空間中,這里的商品既可以是數(shù)字商品,也可以是實(shí)物商品的電子化記錄。(2)代理交易:智能合約作為賣(mài)家的代理與買(mǎi)家交易。買(mǎi)家調(diào)用智能合約并發(fā)送約定數(shù)量的電子貨幣,智能合約將商品交付買(mǎi)家并保存交易憑證。(3)收款:買(mǎi)家調(diào)用智能合約,將買(mǎi)家支付的電子貨幣轉(zhuǎn)給自己。智能合約將所有功能以代碼的方式實(shí)現(xiàn),連同合約存儲(chǔ)一起保存在區(qū)塊鏈上,并分配一個(gè)獨(dú)一無(wú)二的地址,任何獲得該地址的用戶(hù)均可以調(diào)用智能合約參與交易。2智能合約的特點(diǎn)二智能合約的特點(diǎn)

與傳統(tǒng)的合約不同,智能合約中代理的行為是由代碼控制的,并且能夠使用區(qū)塊鏈提供的優(yōu)秀特性,實(shí)現(xiàn)傳統(tǒng)合約不具備的優(yōu)點(diǎn):(1)交易行為的原子性。智能合約的交易過(guò)程,發(fā)貨和付款兩個(gè)行為被視為一個(gè) 具有原子性的“事務(wù)”,要么全部執(zhí)行完成,要么一個(gè)也不執(zhí)行,不會(huì)出現(xiàn)付款收不到商品或者發(fā)貨收不到貨款的情況。(2)合約內(nèi)容的明確性。合約由計(jì)算機(jī)編程語(yǔ)言編寫(xiě),運(yùn)行結(jié)果具有確定性、唯一性,能夠避免傳統(tǒng)合約中使用自然語(yǔ)言可能存在的歧義。(3)交易過(guò)程的不可篡改性。智能合約部署在區(qū)塊鏈上,每個(gè)全節(jié)點(diǎn)均保存一份內(nèi)容同樣的副本。合約被調(diào)用時(shí),網(wǎng)絡(luò)中所有全節(jié)點(diǎn)都會(huì)運(yùn)行被調(diào)用的合約代碼,產(chǎn)生相同的運(yùn)行結(jié)果、保存相同的永久交易憑證。因此合約執(zhí)行是所有全節(jié)點(diǎn)的“共識(shí)”,其安全性可以規(guī)約到區(qū)塊鏈系統(tǒng)的安全性,不超過(guò)半數(shù)的敵手發(fā)起的合謀攻擊無(wú)法對(duì)智能合約進(jìn)行篡改。(4)合約執(zhí)行的強(qiáng)制性。智能合約的交易條款由合約代碼規(guī)定,合約調(diào)用時(shí)由區(qū)塊鏈節(jié)點(diǎn)自動(dòng)執(zhí)行,因此具備強(qiáng)制性,交易參與方(賣(mài)家或者買(mǎi)家)無(wú)法阻止交易執(zhí)行過(guò)程。二智能合約的特點(diǎn)

智能合約部署時(shí),向區(qū)塊鏈網(wǎng)絡(luò)上的每一個(gè)全節(jié)點(diǎn)分發(fā)一份副本。合約被調(diào)用時(shí),每個(gè)全節(jié)點(diǎn)執(zhí)行被調(diào)用的代碼,更新合約存儲(chǔ),并在區(qū)塊打包時(shí)將合約包含在其中。一個(gè)隨之而來(lái)的問(wèn)題是需要確保這些節(jié)點(diǎn)在運(yùn)行相同的代碼時(shí),必須產(chǎn)生嚴(yán)格確定性的、一致的運(yùn)行結(jié)果。一些特殊的操作,如生產(chǎn)隨機(jī)數(shù)、調(diào)用系統(tǒng)API等,在不同的計(jì)算機(jī)上可能返回不同的結(jié)果,會(huì)破壞智能合約交易的一致性。因此,區(qū)塊鏈系統(tǒng)中,一般使用虛擬機(jī)技術(shù)來(lái)消除底層軟硬件系統(tǒng)不同造成的運(yùn)行環(huán)境差異。此外,智能合約部署在所有全節(jié)點(diǎn)上,每個(gè)全節(jié)點(diǎn)都需要保存合約代碼與合約存儲(chǔ),合約調(diào)用發(fā)生時(shí),所有全節(jié)點(diǎn)平行化地執(zhí)行相應(yīng)地代碼,造成了大量的算力與存儲(chǔ)空間冗余。但這也是為了獲得共識(shí)、不可篡改性等安全性要求必須做出的折中。3智能合約的應(yīng)用三智能合約的應(yīng)用

02政務(wù)03供應(yīng)鏈金融0104產(chǎn)權(quán)05保險(xiǎn)三智能合約的應(yīng)用

金融

在傳統(tǒng)金融服務(wù)中,所有操作流程高度依賴(lài)人工參與,整個(gè)過(guò)程需要耗費(fèi)較高的人力成本,區(qū)塊鏈智能合約能夠?qū)崿F(xiàn)數(shù)字身份權(quán)益保護(hù)、財(cái)務(wù)數(shù)據(jù)文件數(shù)字化記錄、股權(quán)支付分割及債務(wù)自動(dòng)化管理、場(chǎng)外衍生品交易處理過(guò)程優(yōu)化、財(cái)務(wù)所有權(quán)轉(zhuǎn)移等方面應(yīng)用,讓整個(gè)流程減少人工操作成本和錯(cuò)誤,同時(shí)提高效率及透明度。利用區(qū)塊鏈和智能合約,不僅可以精確記錄財(cái)務(wù)數(shù)據(jù),還可以用來(lái)管理抵押、資產(chǎn)管理、付款、結(jié)算等多種業(yè)務(wù)。例如:在貸款業(yè)務(wù)中,可以利用智能合約進(jìn)行抵押、自動(dòng)化放款以及還款后自動(dòng)解押等多種流程的自動(dòng)化實(shí)現(xiàn)。并且有助于實(shí)現(xiàn)整個(gè)流程的公開(kāi)、透明,強(qiáng)化跟蹤管理。三智能合約的應(yīng)用

政務(wù)

區(qū)塊鏈去中心化、不可篡改、可信任、可追溯的特性,能夠優(yōu)化政府的工作流程,如通過(guò)建立去中心化、自治的系統(tǒng)應(yīng)用,在智能合約完成基礎(chǔ)建設(shè)后,通過(guò)系統(tǒng)自動(dòng)化管理,在觸發(fā)設(shè)定的條件時(shí),自動(dòng)完成自治行為,如移除成員、添加成員、分配資金,審批流程等等。三智能合約的應(yīng)用

供應(yīng)鏈

供應(yīng)鏈涉及幾個(gè)基本流程,例如從各個(gè)供應(yīng)商處購(gòu)買(mǎi)產(chǎn)品,將其存儲(chǔ)在倉(cāng)庫(kù)中,下訂單,包裝所需產(chǎn)品并將其運(yùn)輸?shù)搅闶凵袒蚩蛻?hù)。供應(yīng)鏈管理是許多智能鏈用例之一,可以使供應(yīng)鏈更加透明和高效。供應(yīng)鏈程序中的每個(gè)動(dòng)作都可以編碼為智能合約??梢詫?shí)時(shí)跟蹤從工廠到零售商店貨架的每個(gè)階段的產(chǎn)品,可以認(rèn)證已交付產(chǎn)品的來(lái)源,減少對(duì)供應(yīng)鏈流程進(jìn)行人工干預(yù)的需求。三概率論和數(shù)理統(tǒng)計(jì)的應(yīng)用

產(chǎn)權(quán)

智能合約可以用于財(cái)產(chǎn)所有權(quán)的交易和轉(zhuǎn)移。首先,財(cái)產(chǎn)所有權(quán)可以使用去中心化的方式記錄在區(qū)塊鏈上,并利用智能合約實(shí)現(xiàn)自動(dòng)化交易。設(shè)置一定的觸發(fā)條件,通過(guò)智能合約判斷條件是否滿足,并實(shí)現(xiàn)自動(dòng)化的財(cái)產(chǎn)所有權(quán)轉(zhuǎn)移。例如跨境采購(gòu)中,可以避免耗時(shí)的談判,繁瑣的文檔編制和復(fù)雜的交易程序。同樣,智能合約也可用于知識(shí)產(chǎn)權(quán)交易,財(cái)產(chǎn)所有人可以保留作品的電子化所有權(quán)證明,使用智能合約聲明所有權(quán)使用的條件和應(yīng)當(dāng)支付的報(bào)酬,每當(dāng)有人使用他們的作品時(shí),觸發(fā)智能合約對(duì)使用行為進(jìn)行記錄,并進(jìn)行自動(dòng)化付款。三概率論和數(shù)理統(tǒng)計(jì)的應(yīng)用

保險(xiǎn)

傳統(tǒng)的保險(xiǎn)理賠需要復(fù)雜的流程,從證據(jù)采集,文書(shū)流轉(zhuǎn),到審核、賠付,整個(gè)過(guò)程主要以人工完成,通常需要數(shù)周甚至數(shù)月的時(shí)間,不但耗費(fèi)大量資源,而且存在人為疏漏造成錯(cuò)誤的可能?;谖锫?lián)網(wǎng)、區(qū)塊鏈和智能合約等技術(shù),可以實(shí)現(xiàn)多種場(chǎng)景下的保險(xiǎn)理賠自動(dòng)化處理。如在車(chē)輛保險(xiǎn)中,車(chē)聯(lián)網(wǎng)通過(guò)安裝在車(chē)輛上的傳感器感知交通事故的發(fā)生,采集事故時(shí)間、位置及其它數(shù)據(jù)作為證據(jù)通過(guò)網(wǎng)絡(luò)上傳至區(qū)塊鏈,車(chē)主、保險(xiǎn)公司、交通管理部門(mén)等各方通過(guò)區(qū)塊鏈實(shí)現(xiàn)安全、公開(kāi)、不可篡改的數(shù)據(jù)分享,將理賠條件、流程寫(xiě)入智能合約,進(jìn)行多方、無(wú)中心的自動(dòng)化事故處理和保險(xiǎn)理賠。4比特幣智能合約四比特幣智能合約

比特幣系統(tǒng)具有編程腳本的功能,實(shí)現(xiàn)了基于計(jì)算機(jī)程序驗(yàn)證數(shù)字貨幣所有權(quán)的轉(zhuǎn)移機(jī)制。一筆交易的完成,是通過(guò)比特幣節(jié)點(diǎn)運(yùn)行內(nèi)置的腳本程序來(lái)實(shí)現(xiàn)的。通過(guò)編寫(xiě)適當(dāng)?shù)哪_本可以構(gòu)造成一些特定的支付條件,實(shí)現(xiàn)多種智能合約的功能,如多重簽名支付、交易鎖定期、保證合同、擔(dān)保與爭(zhēng)端調(diào)解等。因此,比特幣具有在一定程度上支持智能合約的能力,并被稱(chēng)為“可編程的貨幣”。但是,比特幣腳本只能在堆棧上運(yùn)行,支持的虛擬機(jī)指令非常有限,也沒(méi)有循環(huán)、條件跳轉(zhuǎn)等指令,不是圖靈完備的語(yǔ)言,難以支撐復(fù)雜的智能合約應(yīng)用。

在比特幣系統(tǒng)中,每一筆交易都擁有一個(gè)或多個(gè)輸入和一個(gè)或多個(gè)輸出,基于未花費(fèi)的交易輸出UTXO(UnspentTransactionOutput)實(shí)現(xiàn)[1]。即:每一筆交易的輸入,都是基于上一筆交易未被花費(fèi)的輸出。通過(guò)這種方式數(shù)字貨幣從一個(gè)地址轉(zhuǎn)移到另一個(gè)地址,形成了一條所有權(quán)鏈。但是比特幣系統(tǒng)沒(méi)有賬戶(hù)的概念,需要確保交易支付的數(shù)字貨幣不被合法接收方之外的攻擊者冒名獲取。如:在上一筆交易中,Alice給Bob支付了0.1個(gè)BTC,當(dāng)Bob花費(fèi)這0.1個(gè)BTC時(shí)應(yīng)該能夠證明自己擁有這個(gè)UTXO,并且其他人無(wú)法通過(guò)假冒Bob花費(fèi)這個(gè)UTXO。比特幣系統(tǒng)使用內(nèi)置的腳本程序解決這個(gè)問(wèn)題。每一個(gè)交易中都包含輸入記錄和輸出記錄。輸入記錄不但包括對(duì)前一個(gè)交易輸出部分的引用,指明該交易花費(fèi)的數(shù)字貨幣的來(lái)源,而且包含一段腳本代碼,稱(chēng)為解鎖腳本,只有合法接收者才能按照腳本約定出示相應(yīng)信息(鎖的“鑰匙”),獲得UTXO。在每條輸出記錄中也包含一段鎖定腳本,由交易發(fā)起者給出,用于指定接收者,能夠提供相匹配信息的用戶(hù)才能夠解鎖。四比特幣智能合約

在比特幣系統(tǒng)中,每一筆交易都擁有一個(gè)或多個(gè)輸入和一個(gè)或多個(gè)輸出,基于未花費(fèi)的交易輸出UTXO(UnspentTransactionOutput)實(shí)現(xiàn)[1]。即:每一筆交易的輸入,都是基于上一筆交易未被花費(fèi)的輸出。通過(guò)這種方式數(shù)字貨幣從一個(gè)地址轉(zhuǎn)移到另一個(gè)地址,形成了一條所有權(quán)鏈。但是比特幣系統(tǒng)沒(méi)有賬戶(hù)的概念,需要確保交易支付的數(shù)字貨幣不被合法接收方之外的攻擊者冒名獲取。如:在上一筆交易中,Alice給Bob支付了0.1個(gè)BTC,當(dāng)Bob花費(fèi)這0.1個(gè)BTC時(shí)應(yīng)該能夠證明自己擁有這個(gè)UTXO,并且其他人無(wú)法通過(guò)假冒Bob花費(fèi)這個(gè)UTXO。比特幣系統(tǒng)使用內(nèi)置的腳本程序解決這個(gè)問(wèn)題。每一個(gè)交易中都包含輸入記錄和輸出記錄。輸入記錄不但包括對(duì)前一個(gè)交易輸出部分的引用,指明該交易花費(fèi)的數(shù)字貨幣的來(lái)源,而且包含一段腳本代碼,稱(chēng)為解鎖腳本,只有合法接收者才能按照腳本約定出示相應(yīng)信息(鎖的“鑰匙”),獲得UTXO。在每條輸出記錄中也包含一段鎖定腳本,由交易發(fā)起者給出,用于指定接收者,能夠提供相匹配信息的用戶(hù)才能夠解鎖。四比特幣智能合約

收到一個(gè)交易后,比特幣網(wǎng)絡(luò)上的礦工節(jié)點(diǎn)會(huì)驗(yàn)證交易的發(fā)起者是否合法地?fù)碛行枰Ц兜谋忍貛拧S肁lice和Bob的例子來(lái)說(shuō)明這個(gè)過(guò)程:假設(shè)Bob已經(jīng)從Alice那里獲得了0.1個(gè)btc,相應(yīng)的交易記為T(mén)X_1,其輸出記為

TX_1_OUT_1

,在交易中Alice指定了一個(gè)只能由接收者Bob打開(kāi)的“鎖”,由于這把“鎖”的存在,除Bob外的所有人無(wú)法使用這個(gè)比特幣(圖6-2)。假設(shè)Bob要將這0.1個(gè)Btc支付給Joe時(shí),他構(gòu)建一個(gè)新的交易記錄TX_2,在TX_2輸入記錄中包含了對(duì)之前交易輸出

TX_1_OUT_1

的引用,以及一段用Bob的私鑰簽名過(guò)的“鑰匙”(解鎖腳本);在交易TX_2的輸出記錄TX_2_OUT_1中,不但包含本次支付的比特幣數(shù)量0.1BTC,Bob還需要設(shè)置一個(gè)只有接收人Joe才能開(kāi)啟的“鎖”(另一個(gè)鎖定腳本)。這個(gè)新的交易TX_2被Bob發(fā)送給礦工,只有通過(guò)了礦工對(duì)解鎖腳本有效性的驗(yàn)證后,這筆交易才會(huì)被記錄到鏈上賬本中。此時(shí)也意味著B(niǎo)ob完成了一個(gè)接收+花費(fèi)比特幣的典型場(chǎng)景。此時(shí),輸出

TX_1_OUT_1

由于被TX_2中的輸入成功使用,會(huì)被系統(tǒng)被標(biāo)記為已花出。如果嘗試?yán)盟俅螛?gòu)建交易,會(huì)被礦工認(rèn)定為“雙花”從而拒絕。與之相對(duì),輸出

TX_2_OUT_1

由于尚未被任何輸入使用,故被稱(chēng)為未花費(fèi)輸出(即UTXO)。圖6-2鎖定腳本和解鎖腳本四比特幣智能合約

比特幣底層使用腳本編程語(yǔ)言來(lái)實(shí)現(xiàn)“鎖”和“鑰匙”的功能。比特幣的腳本語(yǔ)言是一種基于棧的,并且定義了由操作碼(opcode)組成的指令集合,如:OP_2表示將數(shù)值2推至棧頂,OP_ADD表示將棧頂?shù)膬蓚€(gè)元素相加,OP_EQUAL表示如果棧頂上2個(gè)元素相等,則返回

true;否則返回

false。比特幣虛擬機(jī)(BVM)被引入比特幣節(jié)點(diǎn)。BVM將鎖定腳本連接在解鎖腳本的后面,從而形成完整的執(zhí)行腳本。這個(gè)完整的腳本會(huì)被BVM執(zhí)行。當(dāng)執(zhí)行完畢后,如果棧頂元素的布爾值為

true,則認(rèn)為腳本執(zhí)行成功,反之其他情況則認(rèn)為腳本執(zhí)行失敗。在Alice給Bob支付0.1個(gè)BTC的交易TX1中,Alice創(chuàng)建的輸出腳本類(lèi)似于如下的格式:

OP_DUPOP_HASH160abcd1234…9876OP_EQALVERIFYOP_CHECKSIG其中,OP_DUP、OP_HASH160、OP_EQALVERIFY、OP_CHECKSIG分別表示復(fù)制、哈希、檢查是否相等和簽名校驗(yàn)操作,abcd1234…9876是Bob的公鑰的哈希值。這個(gè)腳本的作用是:如果一個(gè)用戶(hù)能夠出示一個(gè)哈希值為abcd1234…9876的公鑰,同時(shí)出示一個(gè)與此公鑰對(duì)應(yīng)的私鑰生成的簽名,就能證明自己是這0.1個(gè)BTC的合法擁有者。在Alice生成交易輸出時(shí),嵌入的abcd1234…9876是Bob的公鑰的哈希值,Bob不但擁有該公鑰/私鑰對(duì),可以用私鑰生成合法簽名。Bob之外的攻擊者雖然也可能獲得Bob的公鑰,但沒(méi)有相應(yīng)的私鑰,無(wú)法生成合法簽名,因此無(wú)法假冒Bob獲得這筆輸出。同時(shí),任意礦工可以驗(yàn)證簽名與公鑰是否匹配,從而驗(yàn)證交易是否有效。四比特幣智能合約

比特幣底層使用腳本編程語(yǔ)言來(lái)實(shí)現(xiàn)“鎖”和“鑰匙”的功能。比特幣的腳本語(yǔ)言是一種基于棧的,并且定義了由操作碼(opcode)組成的指令集合,如:OP_2表示將數(shù)值2推至棧頂,OP_ADD表示將棧頂?shù)膬蓚€(gè)元素相加,OP_EQUAL表示如果棧頂上2個(gè)元素相等,則返回

true;否則返回

false。比特幣虛擬機(jī)(BVM)被引入比特幣節(jié)點(diǎn)。BVM將鎖定腳本連接在解鎖腳本的后面,從而形成完整的執(zhí)行腳本。這個(gè)完整的腳本會(huì)被BVM執(zhí)行。當(dāng)執(zhí)行完畢后,如果棧頂元素的布爾值為

true,則認(rèn)為腳本執(zhí)行成功,反之其他情況則認(rèn)為腳本執(zhí)行失敗。在Alice給Bob支付0.1個(gè)BTC的交易TX1中,Alice創(chuàng)建的輸出腳本類(lèi)似于如下的格式:

OP_DUPOP_HASH160abcd1234…9876OP_EQALVERIFYOP_CHECKSIG其中,OP_DUP、OP_HASH160、OP_EQALVERIFY、OP_CHECKSIG分別表示復(fù)制、哈希、檢查是否相等和簽名校驗(yàn)操作,abcd1234…9876是Bob的公鑰的哈希值。這個(gè)腳本的作用是:如果一個(gè)用戶(hù)能夠出示一個(gè)哈希值為abcd1234…9876的公鑰,同時(shí)出示一個(gè)與此公鑰對(duì)應(yīng)的私鑰生成的簽名,就能證明自己是這0.1個(gè)BTC的合法擁有者。在Alice生成交易輸出時(shí),嵌入的abcd1234…9876是Bob的公鑰的哈希值,Bob不但擁有該公鑰/私鑰對(duì),可以用私鑰生成合法簽名。Bob之外的攻擊者雖然也可能獲得Bob的公鑰,但沒(méi)有相應(yīng)的私鑰,無(wú)法生成合法簽名,因此無(wú)法假冒Bob獲得這筆輸出。同時(shí),任意礦工可以驗(yàn)證簽名與公鑰是否匹配,從而驗(yàn)證交易是否有效。四比特幣智能合約

礦工收到Bob的交易TX2時(shí),為驗(yàn)證交易的合法性,即確認(rèn)Bob是否真正擁有他想要支付的0.1BTC,按如下步驟執(zhí)行:(1)找到Bob獲得此0.1BTC的交易TX1,將TX2的解鎖腳本和TX1的鎖定腳本按照如下方式連接;(2)在比特幣虛擬機(jī)中建立堆棧,從左至右地運(yùn)行組合后的腳本。(3)將<sig>入棧;其中<sig>為Bob在TX2中用自己的私鑰生成的簽名;解鎖腳本和鎖定腳本的連接將sig入棧四比特幣智能合約

(4)將<PubK>入棧;其中<PubK>為Bob在TX2中出示的自己的公鑰;(5)OP_DUP復(fù)制棧頂元素,即復(fù)制<PubK>;(6)OP_HASH160執(zhí)行哈希操作,即計(jì)算<PubK>的哈希值;復(fù)制棧頂元素執(zhí)行哈希操作四比特幣智能合約

(7)將Alice在TX1中指定的接收人公鑰的哈希值abcd1234…9876放入棧頂;(8)執(zhí)行OP_EQALVERIFY操作,驗(yàn)證棧頂兩個(gè)元素是否相等。即:Bob出示的公鑰的哈希值與Alice給出的公鑰哈希值是否一致,如果一致則從堆棧中移除這兩個(gè)元素,繼續(xù)執(zhí)行下面的腳本;(9)執(zhí)行OP_CHECKSIG,驗(yàn)證Bob給出的簽名<sig>是否是由公鑰<PubK>相對(duì)應(yīng)的私鑰產(chǎn)生的。如果驗(yàn)證通過(guò)則在棧頂放入True。驗(yàn)證棧頂元素是否一致驗(yàn)證簽名四比特幣智能合約

由于交易是通過(guò)腳本來(lái)實(shí)現(xiàn),腳本語(yǔ)言可以表達(dá)一些特定的條件,實(shí)現(xiàn)如下場(chǎng)景:多重簽名應(yīng)用:一個(gè)支付交易必須獲得多個(gè)用戶(hù)的簽名才能完成。可以應(yīng)用在合伙企業(yè)中,限制超過(guò)半數(shù)的股東同意才能進(jìn)行支付。擔(dān)保和爭(zhēng)端調(diào)解:兩個(gè)互不信任的用戶(hù)進(jìn)行交易,當(dāng)交易出現(xiàn)問(wèn)題時(shí),可由指定的第三方進(jìn)行裁決,使用裁決者的簽名和裁定認(rèn)可的一方共同簽名來(lái)兌現(xiàn)這筆交易。保證合同/集資:一個(gè)項(xiàng)目需要多個(gè)共同出資才能實(shí)施,籌集的資金達(dá)不到要求的項(xiàng)目取消,達(dá)到要求時(shí)每個(gè)集資用戶(hù)才真正地付款。5以太坊智能合約五以太坊智能合約與比特幣的腳本相比,以太坊提供了圖靈完備的智能合約,是一種比較大的進(jìn)步。比特幣是數(shù)字資產(chǎn)作為價(jià)值的載體,而以太坊超越了數(shù)字資產(chǎn)屬性,賦能去中心化應(yīng)用,使得去中心化的全球分布式計(jì)算機(jī)變?yōu)榭赡?。?/p>

以太坊智能合約

5.1以太坊賬戶(hù)模型

智能合約是以太坊網(wǎng)絡(luò)上的一種特殊賬戶(hù)。以太坊賬戶(hù)分為兩類(lèi),用戶(hù)賬戶(hù)和智能合約賬戶(hù)。用戶(hù)賬戶(hù)包括兩個(gè)部分:賬戶(hù)地址和賬戶(hù)余額[3]。而智能合約賬戶(hù)包括如下項(xiàng)目:賬戶(hù)地址:和普通賬戶(hù)相同,是賬戶(hù)在以太坊網(wǎng)絡(luò)上的唯一識(shí)別符。賬戶(hù)余額:賬戶(hù)余額意味著智能合約可以擁有數(shù)字資產(chǎn),它可以用賬戶(hù)代碼對(duì)這些資產(chǎn)進(jìn)行處理。合約代碼:智能合約的代碼是編譯好的字節(jié)代碼,在以太坊網(wǎng)絡(luò)節(jié)點(diǎn)上運(yùn)行。合約代碼在智能合約創(chuàng)建時(shí)生成,包含可以調(diào)用的函數(shù)。狀態(tài)代碼:在智能合約中聲明的字段和變量,表示智能合約的當(dāng)前狀態(tài)。它的工作方式與編程語(yǔ)言中類(lèi)的字段變量相同,唯一的區(qū)別是這個(gè)對(duì)象是在以太坊節(jié)點(diǎn)中永久存在的。五

以太坊智能合約

5.1以太坊賬戶(hù)模型以太坊允許一個(gè)智能合約調(diào)用另一個(gè)智能合約,從而實(shí)現(xiàn)智能合約之間的轉(zhuǎn)賬等操作。下面的代碼給出了一個(gè)最簡(jiǎn)單的智能合約的例子。上方代碼中,第1行定義了一個(gè)名為Counter的智能合約,第2行定義了一個(gè)無(wú)符號(hào)整數(shù)變量,該變量的值就是合約當(dāng)前的狀態(tài)。第3~5行是智能合約的構(gòu)造函數(shù),對(duì)變量counter進(jìn)行了初始化,然后在6~8行定義了一個(gè)函數(shù)count(),其功能是將變量進(jìn)行自增操作,當(dāng)該函數(shù)被調(diào)用時(shí),所有人都能看到該智能合約在區(qū)塊鏈上的狀態(tài)將會(huì)加1。五

以太坊智能合約

5.1以太坊賬戶(hù)模型

如下圖所示,將智能合約部署到區(qū)塊鏈網(wǎng)絡(luò)上需要完成如下幾項(xiàng)任務(wù):(1)分配一個(gè)賬戶(hù)地址,如:0x16E0022b17B,(2)初始化賬戶(hù)余額;(3)上傳合約代碼;(4)初始化合約狀態(tài)變量。五

以太坊智能合約

5.2以太坊智能合約的調(diào)用

在比特幣系統(tǒng)中,用戶(hù)只能做一種類(lèi)型的交易:轉(zhuǎn)賬。填寫(xiě)to、from和amount三個(gè)字段,即誰(shuí)來(lái)付錢(qián),付給誰(shuí),付多少錢(qián)。這使比特幣成為一種數(shù)字現(xiàn)金的儲(chǔ)存和流通工具,在用戶(hù)之間實(shí)現(xiàn)價(jià)值的轉(zhuǎn)移。以太坊智能合約中,增加了一個(gè)“data”字段,支持如下三種類(lèi)型的交易:五

以太坊智能合約

5.2以太坊智能合約的調(diào)用

具體操作的過(guò)程為:(1)轉(zhuǎn)賬:向一個(gè)以太坊地址發(fā)送一定數(shù)目的以太坊代幣,如以下代碼向賬戶(hù)‘0x687422…’進(jìn)行轉(zhuǎn)賬,金額為0.0005:(2)創(chuàng)建智能合約創(chuàng)建智能合約是一種特殊的轉(zhuǎn)賬交易,其to字段為空,表示創(chuàng)建一份智能合約,DATA字段包含編譯過(guò)的智能合約字節(jié)碼。五

以太坊智能合約

5.2以太坊智能合約的調(diào)用

(3)調(diào)用合約智能合約的調(diào)用也以轉(zhuǎn)賬交易的方式進(jìn)行,其中to字段表示智能合約賬戶(hù)的地址,DATA字段表示調(diào)用的智能合約函數(shù)名稱(chēng)和函數(shù)的參數(shù)。五

以太坊智能合約

5.3智能合約執(zhí)行的成本Gas

當(dāng)一個(gè)用戶(hù)發(fā)起某個(gè)智能合約的調(diào)用時(shí),以太坊網(wǎng)絡(luò)中的所有全節(jié)點(diǎn)都會(huì)在自己的以太坊虛擬機(jī)(EVM)中運(yùn)行被調(diào)用的智能合約,造成了大量重復(fù)的存儲(chǔ)空間和算力消耗。為了防止惡意用戶(hù)發(fā)起蓄意攻擊造成資源濫用,以太坊規(guī)定在智能合約的調(diào)用過(guò)程中,要對(duì)每個(gè)運(yùn)算步驟收取一定的費(fèi)用,“Gas”就是以太坊使用的收費(fèi)單位,用來(lái)衡量一個(gè)指令或者動(dòng)作需要耗費(fèi)的計(jì)算機(jī)資源的數(shù)量,即俗稱(chēng)的汽油費(fèi)。如,一次乘法運(yùn)算的價(jià)格是5個(gè)Gas,加法是3個(gè)Gas。同時(shí),也需要對(duì)Gas本身指定以ether代幣為單位的價(jià)格。需要針對(duì)每次智能合約調(diào)用,需要給出每單位的Gas愿意支付的價(jià)格水平,即GasPrice。將愿意支付的Gas總量乘以指定的GasPrice,才是運(yùn)行智能合約支付的全部費(fèi)用。如果設(shè)定的GasPrice太低,那么沒(méi)有節(jié)點(diǎn)會(huì)在第一時(shí)間去運(yùn)行該合約,造成調(diào)用不會(huì)被礦工優(yōu)先執(zhí)行并包括在區(qū)塊鏈中。gasprice可以使用建議的數(shù)值,目前約為5?21GWei(1GWei為109Wei或10-9Ether)。智能合約部署或者被調(diào)用時(shí),Gas將從發(fā)起者的賬戶(hù)余額中扣除。

發(fā)起智能合約調(diào)用必須提供足夠的Gas,足以支付合約代碼執(zhí)行完畢所需的計(jì)算和存儲(chǔ)費(fèi)用。代碼執(zhí)行完畢時(shí)剩余的Gas將會(huì)退還,但是如果調(diào)用者給出的Gas太少,造成智能合約代碼執(zhí)行結(jié)束之前Gas已經(jīng)消耗完畢,則礦工將會(huì)立即停止智能合約的運(yùn)行,不再執(zhí)行剩余代碼,也不會(huì)退回已經(jīng)扣除的Gas五

以太坊智能合約

5.4以太坊虛擬機(jī)

以太坊網(wǎng)絡(luò)上的主機(jī)可能運(yùn)行在不同的硬件平臺(tái)上,使用的操作系統(tǒng)也會(huì)有不同,但同一個(gè)智能合約在不同的節(jié)點(diǎn)上運(yùn)行需要有確定的、相同的結(jié)果,不能因?yàn)橄到y(tǒng)架構(gòu)的差異破壞區(qū)塊鏈系統(tǒng)的一致性,因此需要使用一定的技術(shù)手段為智能合約創(chuàng)造一致的運(yùn)行環(huán)境?,F(xiàn)有主流的區(qū)塊鏈架構(gòu)對(duì)智能合約執(zhí)行環(huán)境的設(shè)計(jì)主要分為兩種:虛擬機(jī)和容器。它們的作用都是在一個(gè)沙盒中執(zhí)行合約代碼,并對(duì)合約所使用的資源進(jìn)行隔離和限制。虛擬機(jī)技術(shù)是指能夠像真實(shí)機(jī)器一樣執(zhí)行程序的計(jì)算機(jī)的軟件實(shí)現(xiàn),可以分為兩種類(lèi)型:有些虛擬機(jī)會(huì)模擬出一個(gè)完整的物理計(jì)算機(jī),比如VMware、Hyper-V等,可以在這些虛擬機(jī)上安裝操作系統(tǒng)和應(yīng)用程序;另一些虛擬機(jī)則只提供了硬件的抽象層,而與具體的底層硬件無(wú)關(guān),例如Java虛擬機(jī)。區(qū)塊鏈智能合約系統(tǒng)的設(shè)計(jì)中,很少會(huì)采用模擬完整物理計(jì)算機(jī)的模式,因?yàn)檫@種方式會(huì)消耗大量的資源并嚴(yán)重影響性能,且很難兼容不同的硬件架構(gòu)。絕大多數(shù)的區(qū)塊鏈會(huì)采用更加輕量級(jí)的虛擬機(jī)架構(gòu),例如以太坊開(kāi)發(fā)了EVM,R3Corda則直接采用了JVM,還有一些區(qū)塊鏈采用了V8引擎——Google公司的Java引擎(虛擬機(jī))。以太坊虛擬機(jī)是一種沙盒封裝、與物理機(jī)完全隔離的虛擬機(jī),是智能合約的運(yùn)行環(huán)境。運(yùn)行在EVM中的代碼不僅無(wú)法直接訪問(wèn)物理機(jī)文件系統(tǒng)、其他進(jìn)程以及網(wǎng)絡(luò),同一個(gè)EVM中運(yùn)行的多個(gè)智能合約之間的訪問(wèn)也是受限的。五

以太坊智能合約

5.4以太坊虛擬機(jī)

以太坊虛擬機(jī)中有三種存儲(chǔ)的方式:賬戶(hù)存儲(chǔ)、內(nèi)存和棧。首先,每個(gè)賬戶(hù)具有一塊持久化的存儲(chǔ)區(qū)域,稱(chēng)為賬戶(hù)存儲(chǔ)。這部分?jǐn)?shù)據(jù)是以持久化的方式存儲(chǔ)在區(qū)塊鏈上,而不是在EVM的內(nèi)存中,因此它是非易失的,存儲(chǔ)內(nèi)容不會(huì)隨著合約調(diào)用的結(jié)束而丟失。該存儲(chǔ)是一個(gè)鍵-值對(duì)結(jié)構(gòu)的稀疏散列表,其中鍵和值的長(zhǎng)度都是256位。賬戶(hù)存儲(chǔ)被持久性地保存在區(qū)塊鏈上。因?yàn)橘~戶(hù)存儲(chǔ)需要在每個(gè)全節(jié)點(diǎn)上保留副本,存儲(chǔ)成本很高,修改一個(gè)非0值、將0值賦值為非0分別需要消耗5000和20000個(gè)單位的Gas。內(nèi)存是線性的,可按字節(jié)級(jí)尋址。每次合約調(diào)用時(shí)虛擬機(jī)分配一塊空白內(nèi)存區(qū)域,內(nèi)存耗盡時(shí)將按字進(jìn)行擴(kuò)展(每個(gè)字是256位)。EVM不限制最大內(nèi)存容量,但是擴(kuò)容將消耗一定數(shù)量的gas,隨著內(nèi)存使用量的增長(zhǎng),其費(fèi)用會(huì)以平方級(jí)別增高。與賬戶(hù)存儲(chǔ)不同,內(nèi)存是易失性的,智能合約運(yùn)行結(jié)束后所占的內(nèi)存空間將被釋放,下一次調(diào)用又從新的空白內(nèi)存開(kāi)始。因此,內(nèi)存一般只用來(lái)保存中間結(jié)果。與常見(jiàn)的個(gè)人計(jì)算機(jī)不同,以太坊虛擬機(jī)執(zhí)行運(yùn)算不是基于寄存器的,而是基于棧的。棧以字為單位,每個(gè)字的長(zhǎng)度為256位,棧最大有1024個(gè)元素。對(duì)棧的訪問(wèn)只限于其頂端:將一個(gè)元素放入棧的頂部,或者從棧的頂部取出一個(gè)元素。棧是以太坊虛擬機(jī)的底層實(shí)現(xiàn)機(jī)制,在使用高級(jí)語(yǔ)言進(jìn)行智能合約開(kāi)發(fā)時(shí),一般不會(huì)直接使用棧操作。五

以太坊智能合約

5.4一個(gè)智能合約在以太坊中的生命周期

(1)智能合約的創(chuàng)建[2]在以太坊中,支持使用多種智能語(yǔ)言編寫(xiě)智能合約,如:Solidity語(yǔ)言、Serpent語(yǔ)言、LLL語(yǔ)言等。其中Solidity是使用最為廣泛的語(yǔ)言。使用高級(jí)語(yǔ)言編寫(xiě)的源代碼無(wú)法直接在EVM中運(yùn)行,需要編譯為字節(jié)碼。第一步:創(chuàng)建者編寫(xiě)智能合約,編譯,打包為一個(gè)交易,并將其發(fā)送到以太坊網(wǎng)絡(luò)中。第二步:以太坊網(wǎng)絡(luò)上的節(jié)點(diǎn)接收到該交易,檢查交易的格式是否正確、驗(yàn)證交易簽名是否有效,計(jì)算該交易可能消耗的Gas數(shù)量,并在區(qū)塊鏈上查詢(xún)創(chuàng)建者的賬戶(hù)余額是否有足夠的金額進(jìn)行支付,如余額不足則返回一條錯(cuò)誤信息。第三步:接收節(jié)點(diǎn)將創(chuàng)建智能合約的交易保存在存儲(chǔ)池中,通過(guò)以太坊網(wǎng)絡(luò)向其他節(jié)點(diǎn)廣播發(fā)送該交易,其他收到交易的節(jié)點(diǎn)重復(fù)第二步中的檢查和驗(yàn)證過(guò)程。第四步:節(jié)點(diǎn)競(jìng)爭(zhēng)記賬權(quán)并生成新的區(qū)塊。獲得記賬權(quán)的節(jié)點(diǎn)對(duì)存儲(chǔ)池中所有收到的合約創(chuàng)建相應(yīng)的合約賬戶(hù)、部署合約,生成合約賬戶(hù)的地址(基于發(fā)送者地址與隨機(jī)數(shù)生成),并將該地址發(fā)送給合約創(chuàng)建者。第五步:獲得記賬權(quán)的節(jié)點(diǎn)將新生成的區(qū)塊在區(qū)塊鏈網(wǎng)絡(luò)中傳播,其他節(jié)點(diǎn)接收到區(qū)塊后,檢查并驗(yàn)證智能合約的正確性與合法性,并部署智能合約。五

以太坊智能合約

5.4一個(gè)智能合約在以太坊中的生命周期

(2)智能合約的調(diào)用第一步:調(diào)用者生成一個(gè)交易,其中to字段填入智能合約的賬戶(hù)地址。該交易被發(fā)送到以太坊網(wǎng)絡(luò)中。第二步:網(wǎng)絡(luò)上的全節(jié)點(diǎn)B收到該交易,檢查交易的格式是否正確,驗(yàn)證簽名是否合法,并檢查交易中的gaslimit、gasprice字段,從發(fā)送方賬戶(hù)中扣除相應(yīng)的金額,如果余額不足,則返回一條錯(cuò)誤信息,丟棄交易。第三步:接收節(jié)點(diǎn)將交易通過(guò)以太坊網(wǎng)絡(luò)轉(zhuǎn)發(fā)到其他節(jié)點(diǎn),其他節(jié)點(diǎn)重復(fù)上步中的操作。第四步:全節(jié)點(diǎn)競(jìng)爭(zhēng)記賬權(quán),獲得記賬權(quán)的節(jié)點(diǎn)在本地EVM上運(yùn)行被調(diào)用的智能合約代碼,如果在代碼運(yùn)行完畢之前,指定的GAS已經(jīng)消耗完,則停止運(yùn)行,并將狀態(tài)恢復(fù)到運(yùn)行之前,但不退回已經(jīng)消耗的GAS。第五步:接收節(jié)點(diǎn)將交易請(qǐng)求以及生成的區(qū)塊在以太坊網(wǎng)絡(luò)上傳播。收到區(qū)塊的節(jié)點(diǎn)檢查并驗(yàn)證區(qū)塊,在自己的EVM上運(yùn)行其中的智能合約,并將運(yùn)行結(jié)果進(jìn)行交叉比對(duì),如果結(jié)果相同則同步自己的區(qū)塊鏈。五

以太坊智能合約

5.5智能合約示例--Helloworld

本節(jié)中給出了一個(gè)使用solidity語(yǔ)言編寫(xiě)的簡(jiǎn)單智能合約例子,從本例子可以學(xué)習(xí)智能合約的開(kāi)發(fā)環(huán)境和創(chuàng)建、調(diào)用方法。例子合約實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的加密貨幣系統(tǒng),利用該合約任何人都可以發(fā)行自己的加密貨幣,并且允許用戶(hù)進(jìn)行轉(zhuǎn)賬操作。合約代碼如下:五

以太坊智能合約

5.5智能合約示例--Helloworld五

以太坊智能合約

5.5智能合約示例--Helloworld

代碼的第1行中,pragmas告知編譯器如何處理源代碼的,這一行的含義是源代碼的運(yùn)行環(huán)境是Solidity大于0.5.99版本,小于0.8.0版本。代碼的第3行中,聲明了一個(gè)名為Coin的智能合約。Solidity中合約的含義就是一組代碼(函數(shù)

)和數(shù)據(jù)(狀態(tài)

),它們位于以太坊區(qū)塊鏈的一個(gè)特定地址上。代碼第4行使用address

public

minter聲明了一個(gè)可以被公開(kāi)訪問(wèn)的

address

類(lèi)型的狀態(tài)變量。

address

類(lèi)型是一個(gè)160位的值,不允許任何算術(shù)操作,適合存儲(chǔ)合約地址或外部人員的密鑰對(duì)。關(guān)鍵字

public

自動(dòng)生成一個(gè)函數(shù),允許你在這個(gè)合約之外訪問(wèn)這個(gè)狀態(tài)變量的當(dāng)前值。第5行的mapping函數(shù)建立一個(gè)鍵-值的對(duì)應(yīng)關(guān)系,可以通過(guò)鍵來(lái)查找值,類(lèi)似于Python中的字典。這個(gè)映射的名字是balances,權(quán)限類(lèi)型為public,鍵的類(lèi)型是地址address,值的類(lèi)型是整型uint。在接下來(lái)的“event

Sent(address

from,

address

to,

uint

amount);”這一行中,定義了一個(gè)事件(event)。在本例中,事件會(huì)在第23行,

send

函數(shù)的最后一行被發(fā)出。智能合約中,用戶(hù)界面可以監(jiān)聽(tīng)區(qū)塊鏈上發(fā)送的事件,而不會(huì)耗費(fèi)太多系統(tǒng)資源。一旦某個(gè)智能合約發(fā)出了一個(gè)事件,監(jiān)聽(tīng)該事件的合約都將收到通知。第9行中的函數(shù)

Coin

是智能合約的構(gòu)造函數(shù),在創(chuàng)建合約時(shí)被自動(dòng)運(yùn)行,無(wú)法在事后調(diào)用。在構(gòu)造函數(shù)中,永久存儲(chǔ)創(chuàng)建合約的用戶(hù)的地址:

msg。該函數(shù)中的msg.sender

是函數(shù)調(diào)用者的來(lái)源地址。五

以太坊智能合約

5.5智能合約示例--Helloworld

最后,真正被用戶(hù)或其他合約所調(diào)用的,以完成本合約功能的方法是mint和send函數(shù)。mint函數(shù)中,require是判斷一個(gè)條件是否滿足的函數(shù)。如果該函數(shù)中給定的條件不滿足,則不再執(zhí)行后面的語(yǔ)句。即:mint要求調(diào)用者是合約創(chuàng)建者,否則不會(huì)執(zhí)行后面的轉(zhuǎn)賬操作。而send

函數(shù)可被任何人用于向他人發(fā)送幣,該函數(shù)首先檢查發(fā)送者賬戶(hù)中是否有充足的幣,然后進(jìn)行轉(zhuǎn)賬操作??梢栽谝蕴坏脑诰€編譯環(huán)境remix中調(diào)試和運(yùn)行該合約。Remix是以太坊官方開(kāi)源的Solidity在線集成開(kāi)發(fā)環(huán)境,可以使用Solidity語(yǔ)言在網(wǎng)頁(yè)內(nèi)完成以太坊智能合約的在線開(kāi)發(fā)、在線編譯、在線測(cè)試、在線部署、在線調(diào)試與在線交互,訪問(wèn)地址為/。在remix界面的左上角的添加功能,新建一個(gè)文件,文件名命名為coin.sol,并輸入代碼,如下圖所示:點(diǎn)擊左側(cè)下拉框,可以選擇不同的solidity版本。點(diǎn)擊編譯按鈕,即可自動(dòng)編譯合約。點(diǎn)擊create,會(huì)在內(nèi)存中將該智能合約創(chuàng)建一個(gè)實(shí)例。五

以太坊智能合約

5.6HyperledgerFabric智能合約

在HyperledgerFabric中,智能合約稱(chēng)為Chaincode,中文翻譯為鏈碼。鏈碼是用戶(hù)根據(jù)業(yè)務(wù)邏輯編寫(xiě)的智能合約代碼,被部署在Fabric網(wǎng)絡(luò)節(jié)點(diǎn)上的Docker容器中,它是客戶(hù)端程序和Fabric之間的橋梁,可以被用戶(hù)在外部發(fā)起調(diào)用,負(fù)責(zé)與賬本之間的交互(圖6-14)[4]。鏈碼支持go、java等語(yǔ)言的開(kāi)發(fā),目前,支持最為完善的是go語(yǔ)言。鏈碼可以分為系統(tǒng)鏈碼和普通鏈碼。智能合約通常指的是普通鏈碼,用于在區(qū)塊鏈應(yīng)用程序中實(shí)現(xiàn)業(yè)務(wù)邏輯,而系統(tǒng)鏈碼則是用于系統(tǒng)管理。與普通鏈碼需要獨(dú)立沙盒環(huán)境運(yùn)行不同,系統(tǒng)鏈碼在peer服務(wù)啟動(dòng)時(shí)隨peer節(jié)點(diǎn)注冊(cè),同peer節(jié)點(diǎn)一起運(yùn)行。五

以太坊智能合約

5.6HyperledgerFabric智能合約

(1)鏈碼的生存周期安裝:鏈碼在編寫(xiě)完成后,需要部署在Fabric網(wǎng)絡(luò)中的peer節(jié)點(diǎn)上,同時(shí)注明版本號(hào),完成安裝過(guò)程。實(shí)例化:在peer節(jié)點(diǎn)上安裝的鏈碼需要經(jīng)過(guò)實(shí)例化才能真正激活可用,實(shí)例化的過(guò)程包括鏈碼編譯、打包、封裝docker容器鏡像等步驟。調(diào)用:實(shí)例化后的鏈碼可以被用戶(hù)在peer外部進(jìn)行遠(yuǎn)程調(diào)用,充當(dāng)用戶(hù)與賬本之間的橋梁,進(jìn)行查詢(xún)、寫(xiě)入等操作。調(diào)用包括invoke和Query查詢(xún)。升級(jí):peer上的鏈碼具有可升級(jí)的特點(diǎn),可以把更新版本的鏈碼通過(guò)install操作安裝到當(dāng)前運(yùn)行鏈碼的peer上。(2)鏈碼的調(diào)用和編寫(xiě)以Hyperledgerfabric系統(tǒng)中自帶的一個(gè)示例網(wǎng)絡(luò)和鏈碼介紹鏈碼的常用操作(/chaincode/chaincode_example02/go/)。五

以太坊智能合約

5.6HyperledgerFabric智能合約

查詢(xún)賬本查詢(xún)賬本是利用鏈碼在賬本上執(zhí)行讀取操作。數(shù)據(jù)以鍵/值對(duì)的方式進(jìn)行存儲(chǔ),用戶(hù)可以查詢(xún)單個(gè)或者多個(gè)鍵,并在鍵上執(zhí)行復(fù)雜的檢索操作,如下圖所示,應(yīng)用程序通過(guò)網(wǎng)絡(luò)將查詢(xún)請(qǐng)求提交給鏈碼,鏈碼作為應(yīng)用程序的代理在賬本上執(zhí)行操作并返回結(jié)果五

以太坊智能合約

5.6HyperledgerFabric智能合約

查詢(xún)所有車(chē)輛的函數(shù)queryAllCars已經(jīng)編寫(xiě)好,并放在query.js中,我們可以使用下面的命令,返回賬本中所有車(chē)輛的列表:nodequery.js返回的信息如下所示:五

以太坊智能合約

5.6HyperledgerFabric智能合約

返回了賬本中記錄的10輛汽車(chē),每輛汽車(chē)存儲(chǔ)了顏色、生產(chǎn)廠商、型號(hào)、車(chē)主四項(xiàng)信息。其中CAR0~CAR9是鍵,車(chē)輛的屬性是值。下面使用代碼編輯軟件(如:vscode,atom等)打開(kāi)query.js文件,查看其源代碼:代碼中定義了一些變量,例如通道的名字。具體查詢(xún)的語(yǔ)句如下所示:五

以太坊智能合約

5.6HyperledgerFabric智能合約

當(dāng)我們運(yùn)行該應(yīng)用時(shí),它調(diào)用了peer上的fabcar鏈碼,運(yùn)行了其中的queryAllCars函數(shù),這個(gè)函數(shù)不需要傳遞參數(shù)。查看rabric-samples下面的chaincode/fabca/go子目錄,打開(kāi)fabcar.go源文件,可以看到還有其他幾個(gè)可用的函數(shù):initLegger,queryCAr,qureyAllCars,createCar,changeCarOwner。在源代碼中定位到queAllCars函數(shù),分析它與賬本的交互過(guò)程。五

以太坊智能合約

5.6HyperledgerFabric智能合約

代碼中定義了key的范圍,從car0到car999。下圖給出了應(yīng)用調(diào)用鏈碼中函

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論