
你的第一個智能合約「Hello World」,好像也不是很智能
在看過 我花了 99 個以太坊(Ethereum)來學(xué)智能合約開發(fā)(http://davidfnck.com/blockchain/ethereum-smart-contract-intro.html/) 之后,相信你對以太坊的整體開發(fā)有了一個全局的概念。
開發(fā)環(huán)境
Solidity 選擇
為了快速上手,我們用基于瀏覽器的方便版本來進行 Browser-Solidity(https://ethereum.github.io/browser-solidity)。
等練習(xí)之后,你想自己手動安裝一個,可以參考這里 Solidity 安裝指南(https://solidity.readthedocs.io/en/develop/installing-solidity.html),教程之后更新。
Geth 配置
Geth 是以太坊的客戶端,之前文章 中介紹過。
我的用的 Macbook,之前也安裝好了 Homebrew,所以裝起來非常方便。
brew tap ethereum/ethereum
brew install ethereum
這樣就算安裝完成了,下面開始吧。
啟動環(huán)境
利用 Geth 開始啟動一個以太坊(開發(fā)者)網(wǎng)絡(luò)節(jié)點:
geth --datadir testNet --dev console 2>> test.log
代碼解讀:
–dev 啟用開發(fā)者網(wǎng)絡(luò)(模式),開發(fā)者網(wǎng)絡(luò)會使用POA共識,默認(rèn)預(yù)分配一個開發(fā)者賬戶并且會自動開啟挖礦。
–datadir 后面的參數(shù)是區(qū)塊數(shù)據(jù)及秘鑰存放目錄。
testNet 第一次輸入命令后,它會放在當(dāng)前目錄下新建一個testNet目錄來存放數(shù)據(jù)。
console 進入控制臺
2>> test.log 表示把控制臺日志輸出到test.log文件
執(zhí)行完之后,就會進入到 Geth 控制臺,這時候就像 Python 界面一樣,有一個向右的小箭頭,如下圖:
這時候你可以看到,文件夾里面出現(xiàn)了這樣的文件:
為了更好的理解,建議新開一個命令行終端,實時顯示日志:
tail -f test.log
效果如下圖:
準(zhǔn)備賬戶
部署智能合約需要一個外部賬戶,我們先來看看分配的開發(fā)者賬戶,在控制臺使用以下命令查看賬戶:
th.accounts
也可以使用personal.listAccounts查看賬戶。
再來看一下賬戶里的余額,使用一下命令:
eth.getBalance(eth.accounts[0])
eth.accounts[0]表示賬戶列表第一個賬戶
回車后,可以看到大量的余額,如:
1.15792089237316195423570985008687907853269… e+77
開發(fā)者賬戶因余額太多,如果用這個賬戶來部署合約時會無法看到余額變化,為了更好的體驗完整的過程,這里選擇創(chuàng)建一個新的賬戶。
創(chuàng)建賬戶
創(chuàng)建賬戶
使用以下命令創(chuàng)建賬戶:
> personal.newAccount("davidfnck")
davidfnck 為新賬戶的密碼,回車后,返回一個新賬戶。
這時我們查看賬戶列表:
> eth.accounts
可以看到賬戶數(shù)組你包含兩個賬戶,新賬戶在第二個(索引為1)位置。
現(xiàn)在看看賬戶的余額:
> eth.getBalance(eth.accounts[1])
0
回車后,返回的是0,新賬戶是0。結(jié)果如:
給新賬戶轉(zhuǎn)賬
我們知道沒有余額的賬戶是沒法部署合約的,那我們就從默認(rèn)賬戶轉(zhuǎn)1以太幣給新賬戶,使用以下命令(請使用你自己eth.accounts對應(yīng)輸出的賬戶):
eth.sendTransaction({
from:
'0x19c3a00836780bd96e787f92b0684beedcdbe216',
to:
'0xe837c346e8545907beae50a827b18734443ea685',
value:
web3.toWei(1, "ether")
})
在打開的tail -f test.log日志終端里,可以同時看到挖礦記錄
再次查看新賬戶余額,可以新賬戶有1個以太幣
解鎖賬戶
在部署合約前需要先解鎖賬戶(就像銀行轉(zhuǎn)賬要輸入密碼一樣),使用以下命令:
personal.unlockAccount
(eth.accounts[1],"davidfnck")
這一步很關(guān)鍵,如果你解鎖,你是無法進行以下操作的,會得到這樣的報錯。
Error: authentication needed: password or unlock undefined
編寫合約
現(xiàn)在我們來開始編寫第一個智能合約代碼,solidity代碼如下:
pragma solidity ^0.4.21;
contract hello {
string greeting;
function hello(string _greeting) public {
greeting = _greeting;
}
function say()
constant public returns (string) {
return greeting;
}
}
簡單解釋下,我們定義了一個名為hello的合約,在合約初始化時保存了一個字符串(我們會傳入hello world),每次調(diào)用say返回字符串。
把這段代碼復(fù)制到 Browser-Solidity,如果沒有錯誤,點擊Details獲取部署代碼,如下圖:
在彈出的對話框中找到WEB3DEPLOY部分,點拷貝,粘貼到編輯器后,修改初始化字符串為hello world。
部署合約
代碼如下:
var _greeting = "Hello World" ;
var helloContract = web3.eth.contract([
{"constant":true,"inputs":[],"name":"say",
"outputs":[{"name":"","type":"string"}],
"payable":false,"stateMutability":"view",
"type":"function"},
{"inputs":[{"name":"_greeting",
"type":"string"}],"payable":false,"
stateMutability":"nonpayable",
"type":"constructor"}]);
var hello = helloContract.new(
_greeting,
{
from: web3.eth.accounts[1],
data: '
0x6060604052341561000f57600080fd5b604051610
2b83803806102b88339810160405280805182019190
5050806000908051906020019061004192919061004
8565b50506100ed565b828054600181600116156101
000203166002900490600052602060002090601f016
020900481019282601f1061008957805160ff191683
80011785556100b7565b82800160010185558215610
0b7579182015b828111156100b65782518255916020
0191906001019061009b565b5b5090506100c491906
100c8565b5090565b6100ea91905b808211156100e6
5760008160009055506001016100ce565b5090565b9
0565b6101bc806100fc6000396000f3006060604052
60043610610041576000357c0100000000000000000
0000000000000000000000000000000000000009004
63ffffffff168063954ab4b214610046575b600080f
d5b341561005157600080fd5b6100596100d4565b60
4051808060200182810382528381815181526020019
1508051906020019080838360005b83811015610099
57808201518184015260208101905061007e565b505
05050905090810190601f1680156100c65780820380
516001836020036101000a031916815260200191505
b509250505060405180910390f35b6100dc61017c56
5b60008054600181600116156101000203166002900
480601f016020809104026020016040519081016040
5280929190818152602001828054600181600116156
101000203166002900480156101725780601f106101
4757610100808354040283529160200191610172565
b820191906000526020600020905b81548152906001
019060200180831161015557829003601f168201915
b5050505050905090565b6020604051908101604052
806000815250905600a165627a7a72305820df2cce8
777859296a1396a055f4c0801a5ec58702c4b96d3f3
ccba1f6a752f340029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined')
{
console.log('Contract mined! address: '
+ contract.address + ' transactionHash: '
+ contract.transactionHash);
}
}
)
修改了以下幾點:
第1行:修改字符串為Hello World
第2行:修改合約變量名
第3行:修改合約實例變量名,之后可以直接用實例調(diào)用函數(shù)。
第6行:修改部署賬戶為新賬戶索引,即使用新賬戶來部署合約。
第8行:準(zhǔn)備付的gas費用,IDE已經(jīng)幫我們預(yù)估好了。
第9行:設(shè)置部署回調(diào)函數(shù)。
將該代碼直接拷貝到 Geth 控制臺的小箭頭后面,回車后,就會看到輸出:
說明合約已經(jīng)部署成功。
現(xiàn)在我們查看下新賬戶的余額:
> eth.getBalance(eth.accounts[1])
999999999999793757
比之前的少了。
運行合約
> hello.say()
"Hello World"
輸出Hello World,我們第一個合約Hello World,成功運行了。
到此為止,你的第一個智能合約就完成了,是不是很簡單,確實好像也沒多智能,比其他的好像還要復(fù)雜,不過確實能夠幫助你來了解一下整個的開發(fā)過程了。
如何掌握區(qū)塊鏈技術(shù)
區(qū)塊鏈創(chuàng)新的推動以及數(shù)字經(jīng)濟的蓬勃發(fā)展離不開人才的培育,而CDA數(shù)據(jù)分析師作為行業(yè)的領(lǐng)頭羊,緊密結(jié)合當(dāng)前區(qū)塊鏈發(fā)展實際與人才需求結(jié)構(gòu),重磅推出CDA區(qū)塊鏈學(xué)院。
掃描二維碼,進入 CDA 區(qū)塊鏈學(xué)院,學(xué)習(xí)區(qū)塊鏈知識,選擇很多,站對未來
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03