????????上一章绿鸣,我們講了什么是智能合約谆棺,這一章栽燕,我們結(jié)合以太坊來(lái)講講和更詳細(xì)的學(xué)習(xí)智能合約。
一.賬戶
? ? ????以太坊的核心操作對(duì)象就是賬戶改淑。賬戶又分為兩類:外部所有賬戶和合約賬戶碍岔。
? ? ? ? 外部所有賬戶可能也被簡(jiǎn)稱為“賬戶”,可以這么理解:外部賬戶與其他區(qū)塊鏈電子貨幣的賬戶(如比特幣)一樣朵夏,即外部賬戶具有如下功能和特性:
? ? ? ? 1.人為創(chuàng)建的
? ? ? ? 2.存取貨幣
? ? ? ? 3.是公鑰加密系統(tǒng)加密和產(chǎn)生的賬戶
? ? ? ? 4.以太坊上的外部賬戶還具有創(chuàng)建合約賬戶和部署合約的能力
????????因此蔼啦,外部所有賬戶和合約賬戶,我們都認(rèn)為是一個(gè)狀態(tài)對(duì)象仰猖,這些狀態(tài)主要體現(xiàn)為余額狀態(tài)等捏肢,合約賬戶除擁有余額狀態(tài)外掠河,其還擁有合約存儲(chǔ)狀態(tài)。
? 下面我們來(lá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)建了一個(gè)賬戶,每個(gè)賬戶由一對(duì)公私鑰來(lái)確定煮甥,每個(gè)賬戶其實(shí)就是一個(gè)地址盗温,這個(gè)地址即公鑰的最后20個(gè)字節(jié),這個(gè)地址和私鑰以json格式存儲(chǔ)于keyfile“鑰匙文件”中成肘,并且私鑰將只存儲(chǔ)于用戶客戶端上卖局。密鑰文件格式如下:
{
? ? "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.賬戶備份
? ? ? ?從用戶的鑰匙文件中可以看出,以太坊賬戶的私鑰的密文存儲(chǔ)于ciphertext字段中双霍,用戶通過(guò)輸入密碼獲取到私鑰砚偶,而在交易中的所有簽名都得通過(guò)私鑰來(lái)完成,一旦私鑰丟失洒闸,用戶的賬戶將無(wú)法找回染坯,因此,備份賬戶及私鑰對(duì)我們來(lái)說(shuō)相當(dāng)對(duì)重要丘逸。
? ? 備份賬戶信息单鹿,我們只需要找到以太坊對(duì)存儲(chǔ)目錄即可,當(dāng)然各種操作系統(tǒng)以太坊的存儲(chǔ)目錄我這不再贅述深纲,相關(guān)資料可查看區(qū)塊鏈技術(shù)指南的以太坊賬戶備份部分仲锄。
二.以太幣
? ??????Ether幣最小的單位是Wei,即Ether =10^{18}Wei湃鹊,與比特幣一樣儒喊,以太幣也有自己的一套激勵(lì)機(jī)制-----以太坊上賬戶的操作及智能合約部署等都會(huì)支付以太幣才能支撐運(yùn)轉(zhuǎn),以太幣獲得都獎(jiǎng)勵(lì)主要分為:
? ? ? ? 靜態(tài)獎(jiǎng)勵(lì):每挖出一個(gè)區(qū)塊獲得5個(gè)以太幣
? ? ? ? 動(dòng)態(tài)獎(jiǎng)勵(lì):
? ? ? ? ? ? ?1.挖出的區(qū)塊中交易的費(fèi)用歸礦工所有
? ? ? ? ? ? ?2.挖出的區(qū)塊中含叔區(qū)塊涛舍,礦工可以從叔區(qū)塊中領(lǐng)取額外的1/32個(gè)以太幣的獎(jiǎng)勵(lì)(? ? ? ? ? ? 每個(gè)區(qū)塊僅限2個(gè)叔區(qū)塊)澄惊,以太幣通過(guò)這種機(jī)制可以保障大礦池的壟斷。
? ? ? ? 叔區(qū)塊:指那些被挖出來(lái)的分叉鏈上的區(qū)塊(由于網(wǎng)絡(luò)延遲等原因沒(méi)有被同步到新的區(qū)塊中的區(qū)塊)
三.gas
? ? ? ? 智能合約上鏈后無(wú)法修改富雅,為防止惡意用戶智能合約產(chǎn)生死循環(huán)的可能性掸驱,以太坊要求每執(zhí)行一步智能合約都支付相應(yīng)的費(fèi)用,這些費(fèi)用的最小單位就是gas没佑。每個(gè)智能合約消耗的gas是固定的毕贼,但花費(fèi)但gas越多可能能換取但時(shí)間越短(一種以金錢換時(shí)間的做法)。
? ? ? ? 與gas相關(guān)的幾個(gè)概念及關(guān)聯(lián):
? ? ? ? 1.gas花銷
? ? ? ? ?gas花銷是靜態(tài)的蛤奢,主要針對(duì)與每步操作是不變的鬼癣,保證每個(gè)操作的gas花銷都一樣陶贼。??
? ? ? ? 2.gas價(jià)格
? ??????gas價(jià)格是每個(gè)gas所兌換的以太幣都數(shù)量,將隨以太幣的價(jià)格有所波動(dòng)待秃。
? ? ? ? 3.gas費(fèi)用
????????gas價(jià)格乘以gas花銷即gas費(fèi)用拜秧,單位為以太幣。
四.合約
? ? ? ? 以太坊智能合約與賬戶有相當(dāng)關(guān)聯(lián)章郁,上面我們也曾介紹過(guò)賬戶的類型有外部賬戶和合約 ????賬戶枉氮,這里合約賬戶就是用來(lái)專門執(zhí)行以太坊上的智能合約的。
? ? ? ? 1.編寫智能合約
? ? ? ? ? ? 智能合約是一段可被以太坊虛擬機(jī)執(zhí)行的代碼暖庄,這些代碼以二進(jìn)制的形式存儲(chǔ)于區(qū)塊 ????鏈上聊替,也稱為以太坊虛擬機(jī)位碼。目前培廓,使用于開發(fā)以太坊智能合約的語(yǔ)音有solidity惹悄、serpent和LLL語(yǔ)言,具體相關(guān)語(yǔ)言請(qǐng)?jiā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編寫一個(gè)例子:
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í)行時(shí)肩钠,只識(shí)別以太坊虛擬機(jī)位碼泣港,因此,部署時(shí)蔬将,得將上面使用solidity高級(jí)語(yǔ)言寫的代碼譯成以太坊虛擬機(jī)能識(shí)別的以太坊虛擬機(jī)位碼爷速。
? ? ? ? ????下面我將舉例使用truffle來(lái)部署我們上面的智能合約:
? ??????????truffle的安裝等詳見(jiàn):https://blog.csdn.net/loy_184548/article/details/77984366
? ? ? ? ? ? 在控制臺(tái)中輸入truffle migrate或者truffle migrate --reset,如圖:
這樣霞怀,我們等智能合約已經(jīng)部署好啦惫东。
? ? ? ? 3.調(diào)用智能合約
????????經(jīng)過(guò)以上的部署運(yùn)行后,我們可以通過(guò)web3.js或者geth cli客戶端發(fā)起調(diào)用毙石,相關(guān)調(diào)用api可參考
????http://web3js.readthedocs.io/en/1.0/