????????上一章,我們講了什么是智能合約,這一章,我們結(jié)合以太坊來講講和更詳細(xì)的學(xué)習(xí)智能合約。
一.賬戶
? ? ????以太坊的核心操作對象就是賬戶。賬戶又分為兩類:外部所有賬戶和合約賬戶。
? ? ? ? 外部所有賬戶可能也被簡稱為“賬戶”,可以這么理解:外部賬戶與其他區(qū)塊鏈電子貨幣的賬戶(如比特幣)一樣,即外部賬戶具有如下功能和特性:
? ? ? ? 1.人為創(chuàng)建的
? ? ? ? 2.存取貨幣
? ? ? ? 3.是公鑰加密系統(tǒng)加密和產(chǎn)生的賬戶
? ? ? ? 4.以太坊上的外部賬戶還具有創(chuàng)建合約賬戶和部署合約的能力
????????因此,外部所有賬戶和合約賬戶,我們都認(rèn)為是一個狀態(tài)對象,這些狀態(tài)主要體現(xiàn)為余額狀態(tài)等,合約賬戶除擁有余額狀態(tài)外,其還擁有合約存儲狀態(tài)。
? 下面我們來看看以太坊賬戶的創(chuàng)建、鑰匙文件及備份?
????i.創(chuàng)建賬戶
? ? ? ? ? ?創(chuàng)建賬戶前提是安裝好以太坊和go-ethereum,相關(guān)鏈接可參考?https://blog.csdn.net/ ? ? ?bylaven?/article/details/80386862?from=groupmessage&isappinstalled=0,接著我們可? ? ? ? ?以輸入personal.newAccount()命令創(chuàng)建用戶及設(shè)置密碼
? ? ii.鑰匙文件
? ? ? ? ? ?剛才創(chuàng)建了一個賬戶,每個賬戶由一對公私鑰來確定,每個賬戶其實就是一個地址,這個地址即公鑰的最后20個字節(jié),這個地址和私鑰以json格式存儲于keyfile“鑰匙文件”中,并且私鑰將只存儲于用戶客戶端上。密鑰文件格式如下:
{
? ? "address": "6a787f16c2037826fbc112c337d7b571bb19c022",
? ? "crypto": {
? ? ? ? "cipher": "aes-128-ctr",
? ? ? ? "ciphertext": "8ed39b22ab67a787baa4ebb545382255f747328e2a3e2e74970a0f66b422d169",
? ? ? ? "cipherparams": {
? ? ? ? ? ? "iv": "8e0e0905919d6d1669957fdf65f114ce"? ? ? ? },
? ? ? ? ????"kdf": "scrypt",
? ? ? ? ? ? "kdfparams": {
? ? ? ? ? ? "dklen": 32,
? ? ? ? ? ? "n": 262144,
? ? ? ? ? ? "p": 1,
? ? ? ? ? ? "r": 8,
? ? ? ? ? ? "salt": "a2a84d4843dbcb7c0aefa933f37ead073aefe8503ac8497b77828e85467c6822"? ? ? ? },
? ? ? ? "mac": "1fc4a5d260fdd70e772fdc9a28614e82d5ff0adc6c98332f8455c5aa0a3352ad"? ? },
? ? "id": "7bce1a69-79a2-429a-836c-cc2bf72c80de",
? ? "version": 3}
? ? iii.賬戶備份
? ? ? ?從用戶的鑰匙文件中可以看出,以太坊賬戶的私鑰的密文存儲于ciphertext字段中,用戶通過輸入密碼獲取到私鑰,而在交易中的所有簽名都得通過私鑰來完成,一旦私鑰丟失,用戶的賬戶將無法找回,因此,備份賬戶及私鑰對我們來說相當(dāng)對重要。
? ? 備份賬戶信息,我們只需要找到以太坊對存儲目錄即可,當(dāng)然各種操作系統(tǒng)以太坊的存儲目錄我這不再贅述,相關(guān)資料可查看區(qū)塊鏈技術(shù)指南的以太坊賬戶備份部分。
二.以太幣
? ??????Ether幣最小的單位是Wei,即Ether =10^{18}Wei,與比特幣一樣,以太幣也有自己的一套激勵機(jī)制-----以太坊上賬戶的操作及智能合約部署等都會支付以太幣才能支撐運(yùn)轉(zhuǎn),以太幣獲得都獎勵主要分為:
? ? ? ? 靜態(tài)獎勵:每挖出一個區(qū)塊獲得5個以太幣
? ? ? ? 動態(tài)獎勵:
? ? ? ? ? ? ?1.挖出的區(qū)塊中交易的費(fèi)用歸礦工所有
? ? ? ? ? ? ?2.挖出的區(qū)塊中含叔區(qū)塊,礦工可以從叔區(qū)塊中領(lǐng)取額外的1/32個以太幣的獎勵(? ? ? ? ? ? 每個區(qū)塊僅限2個叔區(qū)塊),以太幣通過這種機(jī)制可以保障大礦池的壟斷。
? ? ? ? 叔區(qū)塊:指那些被挖出來的分叉鏈上的區(qū)塊(由于網(wǎng)絡(luò)延遲等原因沒有被同步到新的區(qū)塊中的區(qū)塊)
三.gas
? ? ? ? 智能合約上鏈后無法修改,為防止惡意用戶智能合約產(chǎn)生死循環(huán)的可能性,以太坊要求每執(zhí)行一步智能合約都支付相應(yīng)的費(fèi)用,這些費(fèi)用的最小單位就是gas。每個智能合約消耗的gas是固定的,但花費(fèi)但gas越多可能能換取但時間越短(一種以金錢換時間的做法)。
? ? ? ? 與gas相關(guān)的幾個概念及關(guān)聯(lián):
? ? ? ? 1.gas花銷
? ? ? ? ?gas花銷是靜態(tài)的,主要針對與每步操作是不變的,保證每個操作的gas花銷都一樣。??
? ? ? ? 2.gas價格
? ??????gas價格是每個gas所兌換的以太幣都數(shù)量,將隨以太幣的價格有所波動。
? ? ? ? 3.gas費(fèi)用
????????gas價格乘以gas花銷即gas費(fèi)用,單位為以太幣。
四.合約
? ? ? ? 以太坊智能合約與賬戶有相當(dāng)關(guān)聯(lián),上面我們也曾介紹過賬戶的類型有外部賬戶和合約 ????賬戶,這里合約賬戶就是用來專門執(zhí)行以太坊上的智能合約的。
? ? ? ? 1.編寫智能合約
? ? ? ? ? ? 智能合約是一段可被以太坊虛擬機(jī)執(zhí)行的代碼,這些代碼以二進(jìn)制的形式存儲于區(qū)塊 ????鏈上,也稱為以太坊虛擬機(jī)位碼。目前,使用于開發(fā)以太坊智能合約的語音有solidity、serpent和LLL語言,具體相關(guān)語言請詳細(xì)關(guān)注:
http://solidity.readthedocs.io/en/v0.4.24/
https://ethfans.org/wikis/Serpent-%E6%8C%87%E5%8D%97
http://llvm.org/docs/tutorial/index.html
? ? ? ? 下面以solidity編寫一個例子:
pragma solidity ^0.4.17;
contract HelloWorld
{
address creator;
string greeting;
function HelloWorld(string _greeting) public
{
creator = msg.sender;
greeting = _greeting;
}
function greet() constant returns (string)
{
return greeting;
}
function setGreeting(string _newgreeting)
{
greeting = _newgreeting;
}
/**********
Standard kill() function to recover funds
**********/
function kill(string name) public returns (string)
{
require(keccak256(name) == keccak256("panzuchao"));
return name;
}
}
? ? ? ? 2.部署智能合約及運(yùn)行
? ? ? ? ? ? 以太坊虛擬機(jī)在執(zhí)行時,只識別以太坊虛擬機(jī)位碼,因此,部署時,得將上面使用solidity高級語言寫的代碼譯成以太坊虛擬機(jī)能識別的以太坊虛擬機(jī)位碼。
? ? ? ? ????下面我將舉例使用truffle來部署我們上面的智能合約:
? ??????????truffle的安裝等詳見:https://blog.csdn.net/loy_184548/article/details/77984366
? ? ? ? ? ? 在控制臺中輸入truffle migrate或者truffle migrate --reset,如圖:

這樣,我們等智能合約已經(jīng)部署好啦。
? ? ? ? 3.調(diào)用智能合約
????????經(jīng)過以上的部署運(yùn)行后,我們可以通過web3.js或者geth cli客戶端發(fā)起調(diào)用,相關(guān)調(diào)用api可參考
????http://web3js.readthedocs.io/en/1.0/