銀行的官僚主義是如此地根深蒂固
他們的專業(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)賬到黑客的賬戶,給以太坊和眾籌投資者造成大量損失。
所以在編寫智能合約方面,如果只是想學習下,那么請隨意嘗試,但如果是要實際應用智能合約,一定要注意其安全性和正確性。