第九章 區(qū)塊鏈開發(fā):編寫一個智能合約

銀行的官僚主義是如此地根深蒂固

他們的專業(yè)知識以及當?shù)氐姆ㄒ?guī)和標準

使得他們很難斬斷戈耳迪之結(jié)

以實現(xiàn)無縫的全球系統(tǒng)

一一智能合約提出者:尼克.薩博(Nick?Szabo)

綁匪、富豪和教父的故事

在編寫智能合約之前,先說一個智能合約的故事。

一個綁匪綁架了富豪的兒子。

教父是黑白兩道通吃的大佬。

綁匪和富豪都相信教父。

富豪收到綁匪電話后,特別擔心給錢之后仍然救不了兒子的性命。

而綁匪也擔心放了人拿不到贖金。

兩者相持數(shù)個小時,富豪兒子提出一個解決辦法,可以讓富豪設立一個三方交易的比特幣錢包地址,該交易只有在綁匪和教父都用私鑰簽名后才有效,并且協(xié)議被全網(wǎng)廣播后綁匪必須馬上放人。

作為一個自動擔保賬戶,當情景滿足規(guī)定條件時,程序就會自動釋放或轉(zhuǎn)移資金。整個過程可以描述為:

富豪建立智能錢包——綁匪用自己私鑰解鎖——仲裁者調(diào)用智能合約函數(shù)——函數(shù)觸發(fā),將資金轉(zhuǎn)移到合約當中,等待回調(diào)發(fā)生。

在以太訪編寫智能合約的邏輯步驟

那么,我們自身又如何能像上述故事那樣,編寫一個智能合約來解決我們的問題呢?

以太坊作為一個運行智能合約的去中心化平臺,提供了一條公開的區(qū)塊鏈,并制定了面向智能合約的一套編程語言。智能合約的開發(fā)者可以在以太坊上使用官方提供的工具來開發(fā)支持以太坊區(qū)塊鏈協(xié)議的應用(即所謂的DApp)。

因此,我們可以選擇在以太坊上進行編寫的智能合約,具體的邏輯步驟如下:

1.啟動一個以太坊節(jié)點。(例如geth或者testrpc)

2.使用solc編譯智能合約。使用源代碼編譯然后獲得二進制代碼。

3.將編譯好的合約部署到網(wǎng)絡。(這一步會消耗以太幣,還需要使用你的節(jié)點的默認地址或者指定地址來給合約簽名)=>?獲得合約的區(qū)塊鏈地址和ABI。(合約接口的JSON標識,包括變量,事件和可以調(diào)用的方法;ABI是合約接口的二進制標識)

4.用web3.js提供的JavaScript?API來調(diào)用合約。(根據(jù)調(diào)用的類型有可能會消耗以太幣)


安裝以太坊的準備工作

如果你是首次接觸ethereum,推薦使用下面的步驟安裝部署。

1.安裝ethereum


2.安裝solc編譯器


安裝后可以使用geth命令創(chuàng)建ethereum賬戶

geth?account?new

3.Solidity語言支持

Browser-solidity提供了在線的Solidity語言測試。需要下載包括Solidity運行環(huán)境的安裝包。

4.安裝客戶端Mist

官方提供錢包客戶端Mist,支持進行交易,同時支持直接編寫和部署智能合約。

所編寫的代碼編譯發(fā)布后,可以部署到區(qū)塊鏈上。使用者可通過Mist發(fā)送指令,調(diào)用相應交易合約,讓以太坊虛擬機令(EVM)?在區(qū)塊鏈上執(zhí)行交易合約。

以太坊現(xiàn)在有多種語言實現(xiàn)的客戶端,包括:

ethereumjs-lib:?javascript語言實現(xiàn)

Ethereum(J):?Java語言實現(xiàn)

ethereumH:?Haskell語言實現(xiàn)

go-ethereum:?go語言實現(xiàn)

Parity:?Rust語言實現(xiàn)

pyethapp:?python語言實現(xiàn)

ruby-ethereum:?Ruby語言實現(xiàn)

在以太坊上編程時的注意事項

完成準備工作后,就可以著手開始編寫屬于自己的智能合約。在編寫過程中,還有一些地方需要注意:

1.查看下驗證節(jié)點能否正常運行。

在成功部署了一個智能合約后,輸入數(shù)據(jù)時即可驗證代碼是否正常運行。

2.部署在其他節(jié)點上

為了使得其他人可以運行你的智能合約,你需要兩個信息:

①智能合約地址Address。

②智能合約ABl?(Appication Binary Interface)。ABI其實就是一個有序的用戶手冊,描述了所有方法的名字和如何調(diào)用它們。我們可以使用如下代碼獲得其ABI和智能合約地址?:

然后你可以實例化一個JavaScrip對象,該對象可以用來在任意聯(lián)網(wǎng)機器上調(diào)用該合約,此處ABI?和Address是上述代碼返回值。


3.?自毀程序

一個交易被發(fā)送到網(wǎng)絡需要支付費用,自毀程序是對網(wǎng)絡的補充,花費的費用遠小于一次常用交易。你可以通過以下代碼來檢驗是否成

功,如果自毀程序運行成功以下代碼會返回0:


實例分析

我們在白皮書中可以看到,以太坊上有兩種應用。

第一類是金融應用,為用戶提供自費管理和參與合約的更強大方法。包括子貨幣、金融衍生品、對沖合約、儲蓄錢包、遺囑,甚至一些其他全面的雇傭合約。

第二類是半金融應用,這里有包含代幣的存在,但也有很重要的非代幣方面,比如為解決計算問題而設的自我強制懸賞。最后,還有在線投票和去中心化治理這樣完全的非金融應用。

我們根據(jù)以太坊白皮書上所說的對沖合約,即一種金融衍生品,來進行代碼編寫。以下是白皮書上所舉的一個例子:?等待A輸入1000以太幣;?等待B輸入1000以太幣;?通過查詢數(shù)據(jù)提供合約,將價值1000以太幣的等值美元,例如x美元,記錄至存儲器。

30天后,允許A或B“重新激活”合約以發(fā)送價值x美元的以太幣(重新查詢數(shù)據(jù)提供合約,以獲取新價格并計算)?給A,并將剩余的以太幣發(fā)送給B。

實現(xiàn)步驟如下:

1.確定進行交易的雙方,包含雙方地址,是否投票(默認為否),金額等數(shù)據(jù)。代碼如下:


2.對雙方進行初始化,首先每個賬戶內(nèi)打入1000以太幣;?確認交易后,將bool重新設定為true;?接著用一個storage保存相關(guān)地址以方便后面調(diào)用(如果沒有amount而使用balance,將會使得storage無法調(diào)用);?最后兩個賬戶之間的轉(zhuǎn)賬可以只用msg.sender?(準備下次實現(xiàn)),目前只有將amount數(shù)值設定為0,來表示將1000ether轉(zhuǎn)入對沖基金,在現(xiàn)實生活中則有很高的風險,是明顯不可取的。代碼如下:


3.實現(xiàn)對沖的第一步,將1000ether根據(jù)匯率轉(zhuǎn)換成其他貨幣;


4.實現(xiàn)對沖的第二步,30天后再次轉(zhuǎn)化回以太幣。值得注意的是,使用了bool以防交易失敗;


5.確定雙方交易的金額;


通過這五步,一個簡單的智能合約就建立起來了。注意,這個智能合約在轉(zhuǎn)換匯率的時候用的是模型,這是一種理想狀態(tài),程序可以在Remix上完成調(diào)試。

所有代碼組合起來如下:

以上代碼就簡單構(gòu)成了一個智能合約——對沖合約,這個對沖合約還不夠完善,還需要我們更加詳細地引入函數(shù)和變量來優(yōu)化它。

結(jié)語

智能合約的編寫其實并不困難,但對于編寫智能合約代碼的邏輯和正確性需要認真對待。The?DAO事件中,黑客就是利用了智能合約的漏洞,攻擊了該智能合約,使合約內(nèi)源源不斷有以太幣轉(zhuǎn)賬到黑客的賬戶,給以太坊和眾籌投資者造成大量損失。

所以在編寫智能合約方面,如果只是想學習下,那么請隨意嘗試,但如果是要實際應用智能合約,一定要注意其安全性和正確性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容