參考地址:Ethereum Homesteadjavascript
智能合約是代碼和數據的集合,寄存與Blockchain的具體的地址。智能合約更想是在Blockchain中的一個自動化的代理(或者說是機器人or NPC),智能合約有本身的帳戶,在時間或事件的驅動下能自動執行一些功能,如能夠在相互之間傳遞信息,修改區塊鏈的狀態(帳戶信息等),以及圖靈完備計算(能夠用圖靈機作到的全部事情,通俗來講就是通常編程語言能夠作的全部事情)。以太坊的智能合約是以太坊特定的字節碼,被叫作EVM字節碼。html
用戶不可能直接編寫EVM字節碼,因此以太坊提供了幾種編寫智能合約的高級語言。前端
Solidity:類JavaScript,這是以太坊推薦的旗艦語言,也是最流行的智能合約語言。具體用法參加Solidity文檔。java
Serpent:類Pythongit
LLL:類Lispgithub
能夠根據不一樣的習慣選擇不一樣的高級語言。這裏選用最流行的Solidityweb
如下的概念是智能合約可能用到的,這裏不作詳細介紹,想了解的能夠參考 智能合約菜鳥教程數據庫
公鑰加密系統:npm
點對點網絡:編程
區塊鏈:區塊鏈能夠看作是智能合約的基礎設施
以太坊虛擬機:解釋執行智能合約字節碼的東西,功能相似於Java虛擬機
節點:
礦工:區塊鏈中參與處理區塊的節點叫作礦工。當前以太坊活躍的礦工:https://ethstats.net/
工做量證實:礦工們老是在競爭解決一些數學問題。第一個解出答案的(算出下一個區塊)將得到以太幣做爲獎勵。而後全部節點都更新本身的區塊鏈。全部想要算出下一個區塊的礦工都有與其餘節點保持同步,而且維護同一個區塊鏈的動力,所以整個網絡老是能達成共識。
以太幣:ETH,以太坊中的虛擬貨幣,能夠購買和使用,也能夠與真實貨幣交易。以太幣的走勢圖
Gas:至關於手續費。在以太坊執行程序以保存數據都要消耗必定量的以太幣。這個機制能夠控制區塊鏈中計算的數量,保證效率。
以太坊社區把基於智能合約的應用稱爲去中心化的應用程序(Decentralized App)。DApp的目標是(或者應該是)讓你的智能合約有一個友好的界面,外加一些額外的東西,例如IPFS(能夠存儲和讀取數據的去中心化網絡,不是出自以太坊團隊但有相似的精神)。DApp能夠跑在一臺能與以太坊節點交互的中心化服務器上,也能夠跑在任意一個以太坊平等節點上。(花一分鐘思考一下:與通常的網站不一樣,DApp不能跑在普通的服務器上。他們須要提交交易到區塊鏈而且從區塊鏈而不是中心化數據庫讀取重要數據。相對於典型的用戶登陸系統,用戶有可能被表示成一個錢包地址而其它用戶數據保存在本地。許多事情都會與目前的web應用有不一樣架構。)
DApp流程:
Solidity智能合約能夠經過多種方式進行編譯
在這裏選擇solc和web3.eth.compile.solidity方式
參考:go Ethereum client。安裝不比較簡單,這裏詳細說了
1. 做爲cpp-ethereum的一部分安裝
若是經過編譯的方式安裝了cpp-ethereum(參考:http://www.cnblogs.com/fengzhiwu/p/5547911.html),那麼solc編譯器就會做爲cpp-ethereum的一個子項目也被編譯安裝,在webthree-umbrella/build/solidity/solc目錄下找到solc編譯器的可執行文件。
而後,在/bin或/usr/bin目錄下建立軟連接就好了
ln -s /home/vagrant/Code/workspace/webthree-umbrella/build/solidity/solc/solc /bin/solc
2. 單獨安裝solc
參考:http://solidity.readthedocs.io/en/latest/installing-solidity.html
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
which solc
把solc添加入geth中直接使用(在geth中輸入)
admin.setSolc("path/to/solc")
這種方法和安裝cpp-etheruemle相似,不過最後的編譯步驟改成:
cd webthree-umbrella./webthree-helpers/scripts/ethupdate.sh --no-push --simple-pull --project solidity # update Solidity repo ./webthree-helpers/scripts/ethbuild.sh --no-git --project solidity --cores 4 -DEVMJIT=0 -DETHASHCL=0 # build Solidity only
打開一個geth console,輸入:web3.eth.getCompilers(),就會打印
直接在console中編譯一個簡單的合約代碼
> source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"> clientContract = eth.compile.solidity(source).test
編譯返回的結果的JSON格式以下
其中,
code:編譯後的EVM字節碼
info:編譯器返回的metadata
abiDefination:Application Binary Interface定義。具體接口規則參見這裏
compilerVersion:編譯此代碼的solidity編譯器版本
developerDoc:針對開發者的Natural Specification Format,相似於Doxygen。具體規則參見這裏
language:合約語言
languageVersion:合約語言版本
source:源代碼
userDoc:針對用戶的Ethereum的Natural Specification Format,相似於Doxygen。
編譯器返回的JSON結構反映了合約部署的兩種不一樣的路徑。info信息真實的存在於區中心化的雲中,做爲metadata信息來公開驗證Blockchain中合約代碼的實現。而code信息經過建立交易的方式部署到區塊鏈中。
在進行此步驟前,確保你有一個解鎖的帳戶而且帳戶中有餘額。(能夠建立本身獨立的測試網絡,即本身的區塊鏈,初始化的時候就能夠初始化一些有餘額的帳戶)。參考:Test Networks
如今就能夠在區塊鏈中建立一個合約了。建立合約的方式是發送一個交易,交易的目的地址是空地址,數據是前面JSON結構中的code字段。
建立合約的流程以下
var primaryAddress = eth.accounts[0]
var abi = [{ constant: false, inputs: [{ name: 'a', type: 'uint256' } ]}]
var MyContract = eth.contract(abi)
var contract = MyContract.new(arg1, arg2, ..., {from: primaryAddress, data: evmByteCodeFromPreviousSection}) //arg1,arg2,...是構造參數,這裏沒有,須要去掉。紅色部分用前面生成的code代替
i. 得到帳戶
ii. 定義一個abi (abi是個js的數組,不然不成功)
iii. 建立智能合約
iv. 發送交易部署合約
若是交易被pending,如圖說明你的miner沒有在挖礦,
啓動一個礦工
miner.setEtherbase(eth.primaryAddress) //設定開採帳戶miner.start(8)
eth.getBlock("pending", true).transactions
這時候發現交易已經在區塊中
不過會發現,交易仍是pending,這是由於該交易區塊沒有人協助進行運算驗證,這時候只須要再啓動一個礦工就好了
miner.start(8)
參考:Private Testnet
發現區塊1部署了交易
能夠經過eth.contract()定義一個合約對象,這個對象包含變數合約接口的abi
Multiply7 = eth.contract(clientContract.info.abiDefinition); var myMultiply7 = Multiply7.at(contract.address);
到這兒,就能夠調用智能合約的函數了。
myMultiply7.multiply.call(3)或myMultiply7.multiply.sendTransaction(3, {from: contract.address})
到此,對智能合約的初次體驗就結束了。另外智能合約以及DApp還能夠幹不少NB的事情。之後會進一步討論。