網(wǎng)絡上不少部署智能合約的文章,但是都有一個共同的特點案怯,就是采用命令行的方式來部署君旦,先是建立SOLC的編譯環(huán)境,然后部署Geth或者Eth節(jié)點嘲碱,然后一步一步生成錢包金砍、ABI、合約地址進行部署麦锯,對初學者來說晦澀難懂而且容易失敗恕稠,本文主要介紹如何在圖形化界面下一鍵部署和調用智能合約。
一扶欣、???????智能合約和DAPP概述
1鹅巍、? 智能合約基本概念
? ? ? ? 智能合約是一段代碼和數(shù)據(jù)的集合千扶,可以部署以太坊網(wǎng)絡上運行。如果做比喻的話智能合約更像是JAVA程序骆捧,JAVA程序通過JAVA虛擬機(JVM)將代碼解釋字節(jié)進行執(zhí)行澎羞,以太坊的智能合約通過以太坊虛擬機(EVM)解釋成字節(jié)碼進行執(zhí)行,如果你學過匯編敛苇,會發(fā)現(xiàn)編譯后的字節(jié)碼和匯編很類似妆绞。同時智能合約有自己的賬戶,在時間或事件的驅動下能自動執(zhí)行一些功能枫攀,如可以在相互之間傳遞信息括饶,修改區(qū)塊鏈的狀態(tài)比如賬戶信息等。以太坊的智能合約最大的特點是圖靈完備脓豪,通俗來說可以完全模擬一臺計算機所能做的所有事情巷帝,大家熟知的比特幣其實也可以執(zhí)行一些簡單腳本,但是他就不是圖靈完備扫夜,比如循環(huán)指令比特幣就無法執(zhí)行。
以太坊虛擬機(EVM)
? ? ? ? 以太坊虛擬機(EVM)是以太坊中智能合約的運行環(huán)境驰徊。它不僅被沙箱封裝起來笤闯,事實上它被完全隔離運行,也就是說運行在EVM內(nèi)部的代碼不能接觸到網(wǎng)絡棍厂、文件系統(tǒng)或者其它進程颗味,甚至智能合約之間也只有有限的調用。
2牺弹、? DAPP基本概念
? ? ? ? 初學者經(jīng)常把智能合約和DAPP搞混浦马,以太坊社區(qū)把基于智能合約的應用稱為去中心化的應用程序(Decentralized App)。DApp的目標是讓你的智能合約有一個友好的界面张漂,外加一些額外的有利于用戶使用的東西晶默。典型的DApp例子由一個html界面,web3運行庫航攒,一段JS代碼以及部署在區(qū)塊鏈上的一段智能合約組成磺陡。與一般CS架構的網(wǎng)站不同,DApp不能在普通的服務器上運行漠畜,DApp必須運行在一臺能與以太坊節(jié)點交互的服務器上币他,或者任意一個以太坊節(jié)點上。DApp通過提交交易到區(qū)塊鏈網(wǎng)絡與對應的智能合約進行交互憔狞,并且從區(qū)塊鏈網(wǎng)絡而不是中心化數(shù)據(jù)庫比如(MYSQL數(shù)據(jù)庫)讀取重要數(shù)據(jù)蝴悉。相對于典型的BS架構用戶登錄系統(tǒng)不同,以太坊用戶被表示成一個十六進制的地址而且所有用戶數(shù)據(jù)和其他數(shù)據(jù)均保存在本地瘾敢,與目前的web應用架構有很多不同拍冠。
3硝枉、? 智能合約高級語言
? ? ? ? 用戶不可能直接編寫以太坊虛擬機(EVM)字節(jié)碼,所以以太坊提供了幾種編寫智能合約的高級語言倦微。
Solidity:類似JavaScript妻味,這是以太坊推薦的旗艦語言,也是最流行的智能合約語言欣福。具體用法參加Solidity文檔责球,地址:https://solidity.readthedocs.io/en/latest/
Serpent:類似Python風格,文檔地址:https://github.com/ethereum/wiki/wiki/Serpent
LLL:類似Lisp風格拓劝,目前已經(jīng)被終止了雏逾。
可以根據(jù)不同的習慣選擇不同的高級語言,目前最流行的是Solidity
二郑临、???????在以太坊私有鏈上部署第一個智能合約
? ? ? ? 本文的智能合約采用以太坊官方的示例合約栖博,功能就是在區(qū)塊鏈上存儲一個數(shù)字,并能夠讀取出來厢洞。代碼如下:
pragma solidity ^0.4.18;
contract SimpleStorage {
????uint storedData;
????function set(uint x)public {
????????storedData= x;
????}
????function get() public constant returns (uint) {
????????return storedData;
????}
}
? ? ? ? 即使沒有學過Solidity語言也可以大致看出仇让,該合約set函數(shù)存儲一個數(shù)字在X變量中,get函數(shù)從X變量中讀取這個數(shù)字出來躺翻,下面對這個合約進行部署:
1丧叽、? 啟動私有鏈
啟動以太坊私有鏈Geth和Ethereum-Wallet圖形界面。啟動后界面如下, Ethereum-Wallet會顯示紅色的PRIVTE-NET標記公你。
2踊淳、創(chuàng)建兩個錢包
? ? ? ? 點擊”ADD ACCOUNT” 按鈕,添加一個錢包陕靠,程序會彈出一個對話框迂尝,提示輸入兩遍密碼,輸入完密碼后剪芥,賬號即創(chuàng)建成功垄开。創(chuàng)建其他的賬號,一樣的操作粗俱,從上面的截圖可以看到说榆,有三個賬號,一個是MAIN ACCOUNT寸认,一個是ACCOUNT2签财,一個是ACCOUNT3
3、挖礦獲取一些以太幣
? ? ? ? 賬號創(chuàng)建后偏塞,還沒有以太幣唱蒸,需要在私有鏈上挖礦,切換到Geth界面灸叼,輸入
miner.start(1)
? ? ? ? miner命令括號中的1表示用一個線程進行挖礦神汹,如果不配置庆捺,就會讓CPU全速運行,影響計算機的使用屁魏。
? ? ? ? ?運行一會后滔以,主賬號就會獲取很多以太幣,這個時候屏幕會快速刷屏氓拼,不用管你画,輸入命令miner.stop()停止挖礦。
4桃漾、? 將一個錢包的以太幣轉到另一個錢包中
? ? ? ? 先點擊ACCOUNT2賬號坏匪,進入賬號詳情的界面,點擊右側的“COPY address”撬统,把ACCOUNT2的地址拷貝下來适滓,系統(tǒng)會提示你現(xiàn)在你處在一個測試網(wǎng)絡,不要轉入真正的以太幣到這個賬號恋追。
點擊錢包中“SEND”按鈕凭迹,從MAINACCOUNT給ACCOUNT2轉入一定以太幣,同時可以看到執(zhí)行這筆交易的費用是0.00042個以太幣几于。
點擊發(fā)送后會提示如輸入密碼蕊苗,但這時還沒有發(fā)送成功,根據(jù)區(qū)塊鏈的交易規(guī)則沿彭,需要礦工的確認,并且每筆交易需要確認12個塊尖滚,一個塊是16秒的生成時間喉刘。切換到Geth程序,輸入挖礦命令漆弄,直到ACCOUNT2上顯示100個以太幣睦裳,然后停止挖礦。
5撼唾、? 部署智能合約?
?點“CONTRACTS”廉邑,進入智能合約管理界面,點擊“DEPOLY NEW CONTRACT”,開始部署智能合約倒谷,選擇部署智能合約的賬號蛛蒙,并輸入智能合約的代碼后,如下圖
注意:圖中合約代碼的過舊牵祟,參考篇頭代碼
輸入完畢后點擊“DEPLOY”,系統(tǒng)會提示輸入賬號密碼抖格,因為部署智能合約是需要費用的诺苹。
這個時候是看不到部署的智能合約的咕晋,切換到Geth界面,進行挖礦收奔,在12個塊后掌呜,智能合約就能確認并顯示出來。
挖礦12個區(qū)塊之后坪哄,合約被確認质蕉,如圖:
三、???????運行智能合約
1损姜、 在本節(jié)點上運行智能合約
點擊“CONTRACTS”進入智能合約界面饰剥,可以看到剛才部署的智能合約“SimpleStorage”,點擊進入該智能合約摧阅,進入詳情界面汰蓉,其中有智能合約寫入?yún)^(qū)域和讀取區(qū)域,首先啟動Geth的挖礦棒卷,然后在寫入?yún)^(qū)域選擇相應的智能合約函數(shù)SET顾孽,在下面的數(shù)值輸入框輸入想設置的數(shù)值,運行一會后就可以在讀取區(qū)域看到智能合約函數(shù)GET中Retval的返回值有變化比规。
? ? ? ? ?其他智能合約的運行也是一樣若厚,無非就是函數(shù)多點,輸入多點蜒什。
在右側set方法里輸入數(shù)值333. 點擊下方的execute,輸入當前賬戶的密碼测秸,向鏈條發(fā)送指令,此時交易指令未被確認灾常,處于待確認狀態(tài)霎冯。需要挖礦進行確認。
2钞瀑、 在其他節(jié)點上運行智能合約
? ? ? ? 此時的智能合約只能自己能看到沈撞,別人是無法看到和運行的,如果其他人要運行你部署好的智能合約需要提供一些信息雕什,就是其他教程中所說的智能合約的ABI和地址缠俺。
進入剛部署的“SimpleStorage”智能合約界面,右側有四個按鈕
A.“Deposit Eher”:向該智能合約發(fā)送以太幣
B.“Copy address”:拷貝該智能合約的地址
C.“Show QR Code”:顯示一個二維碼贷岸,如果用手機掃描的話壹士,顯示該智能合約的地址
D.“Show Interface”:顯示該智能合約的JSON接口,也就是ABI
? ? ? ? 首先我們點“Copy address”凰盔,拷貝該智能合約的地址墓卦,然后點“Show Interface”將智能合約的JSON接口全部拷貝出來,在另一個需要運行智能合約的節(jié)點打開Ethereum-Wallet户敬,打開“CONTRACTS”界面點擊“WATCH CONTRACTS”添加一個智能合約落剪。
?如上圖所示睁本,CONTRACT NAME隨便填,CONTRACT ADDRESS填寫智能合約地址忠怖,JSON INTERFACE填寫剛才在”Show Interface “中拷貝的內(nèi)容呢堰。點OK后,就可以看到這個智能合約并運行了凡泣。
四枉疼、???????智能合約的部署原理
1、智能合約的部署架構
? ? ? ? ?本文介紹的智能合約的部署雖然是在圖形化界面編譯和執(zhí)行鞋拟,但其實最主要的是依賴于后臺運行Geth的節(jié)點骂维,此時Geth提供了一個RPC的接口向圖形化界面的錢包提供區(qū)塊鏈的信息。
RPC接口
Geth在8545端口提供了JSON RPC API 贺纲,數(shù)據(jù)傳輸采用JSON格式航闺,可以執(zhí)行Web3庫的各種命令,比如向前端猴誊,比如mist等圖形化客戶端提供區(qū)塊鏈的信息潦刃,默認訪問地址為http://localhost:8545。
? ? ? ? 我們部署一個智能合約時懈叹,首先Ethereum-Wallet調用SOLC智能合約編譯器將代碼編譯成成EVM字節(jié)碼乖杠,然后將EVM字節(jié)碼通過Geth的RPC接口發(fā)送到以太坊網(wǎng)絡,經(jīng)過全網(wǎng)驗證后澄成,同時寫入到每個Geth管理的區(qū)塊鏈中胧洒,架構如下
2、 部署的數(shù)據(jù)流
? ? ? ?首先代碼先經(jīng)過SOLC編譯變?yōu)榱硕M制碼墨状,然后通過一筆交易來創(chuàng)建智能合約脆栋,該筆交易包含了創(chuàng)建者賬號替蛉、智能合約內(nèi)容钞澳、智能合約的地址這幾個關鍵信息奇钞,其中智能合約地址的生成是由創(chuàng)建者的賬號和發(fā)送的交易數(shù)作為隨機數(shù)輸入随闺,通過Kecca-256加密算法重新創(chuàng)建一個地址作為賬號卒废。
部署過程中里逆,需要通過交易來部署娇妓,同時數(shù)據(jù)要存儲到區(qū)塊鏈上肛根,這些需要使用到GAS辫塌。
交易(Transactions)
? ? ? ? 一筆交易是一條消息,從一個賬戶發(fā)送到另一個賬戶派哲。交易可以包含二進制數(shù)據(jù)(payload)和以太幣臼氨。
? ? ? ? 如果目標賬戶包含代碼,該代碼和輸入數(shù)據(jù)會被執(zhí)行芭届。
? ? ? ? 如果目標賬戶是零賬戶(賬戶地址是0)储矩,交易將創(chuàng)建一個新合約感耙。正如上文所講,這個智能合約地址不是零地址持隧,而是由合約創(chuàng)建者的地址和該地址發(fā)出過的交易數(shù)量計算得到即硼。創(chuàng)建合約交易的payload被當作EVM字節(jié)碼執(zhí)行。執(zhí)行的輸出做為合約代碼被永久存儲屡拨。這意味著只酥,為了創(chuàng)建一個合約,你不需要向合約發(fā)送真正的合約代碼呀狼,而是發(fā)送能夠返回可執(zhí)行代碼的代碼裂允。
Gas
? ? ? ? 以太坊上的每筆交易都會被收取一定數(shù)量的gas,gas的目的是限制執(zhí)行交易所需的工作量哥艇,同時為執(zhí)行支付費用绝编。當EVM執(zhí)行智能合約時,gas將按照特定規(guī)則被逐漸消耗她奥,其實GAS就是以太幣的比較小的單位瓮增,如果以太幣比作100元,那么GAS可以看作是1分錢哩俭。如果只有以太幣绷跑,會有問題,以太幣是需要大家買賣的凡资,市場會有價格波動砸捏。可能會出現(xiàn)比特幣這樣的狀況隙赁,一天跌50%漲50%垦藏。這個對計算的成本是不能接受的,例如今天做一個加法需要十塊錢伞访,明天做一個加法需要一百塊錢掂骏。所以這里引入gas來解耦。把市場的波動和計算的開銷來解耦厚掷,也就是說以太幣和gas之間是有匯率的弟灼,以太幣漲沒關系,gas價格下降就可以了冒黑。它要保證我做同樣的計算田绑,消耗的法幣是一致的。
? ? ? ? gas price(gas價格抡爹,以太幣計)是由交易創(chuàng)建者設置的掩驱,發(fā)送賬戶需要預付的交易費用 = gas price * gas amount。 如果執(zhí)行結束還有gas剩余,這些gas將被返還給發(fā)送賬戶欧穴。
前文中曾經(jīng)提到部署智能合約使用了0.00042個以太幣民逼,換算成gas就是21000個gas。
? ? ? ? 無論執(zhí)行到什么位置苔可,一旦gas被耗盡(比如降為負值)缴挖,將會觸發(fā)一個out-of-gas異常。當前調用幀所做的所有狀態(tài)修改都將被回滾焚辅。
五映屋、???????智能合約的運行原理
? ? ? ? 智能合約是部署在區(qū)塊鏈的代碼,區(qū)塊鏈本身不能執(zhí)行代碼同蜻,代碼的執(zhí)行是在本地的EVM中棚点,實際上,部署在區(qū)塊鏈上代碼是能夠在本地產(chǎn)生原智能合約代碼的代碼湾蔓,可以理解區(qū)塊鏈為一個數(shù)據(jù)庫瘫析,而客戶端從數(shù)據(jù)庫中讀取了存儲的運行代碼,并在本地運行后默责,將結果寫入到了區(qū)塊鏈這個數(shù)據(jù)庫中贬循。
本質上,以太坊的錢包也是智能合約的一個應用桃序,以太坊搭建的是一個可供編寫各種應用的平臺杖虾。下一篇,將詳細講述智能合約的開發(fā)編寫和調試方法媒熊。
參考:
https://blog.csdn.net/sportshark/article/details/52249607
https://blog.csdn.net/slow_wakler/article/details/72492248