
你的第一個智能合約「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共識,默認預(yù)分配一個開發(fā)者賬戶并且會自動開啟挖礦。
–datadir 后面的參數(shù)是區(qū)塊數(shù)據(jù)及秘鑰存放目錄。
testNet 第一次輸入命令后,它會放在當前目錄下新建一個testNet目錄來存放數(shù)據(jù)。
console 進入控制臺
2>> test.log 表示把控制臺日志輸出到test.log文件
執(zhí)行完之后,就會進入到 Geth 控制臺,這時候就像 Python 界面一樣,有一個向右的小箭頭,如下圖:
這時候你可以看到,文件夾里面出現(xiàn)了這樣的文件:
為了更好的理解,建議新開一個命令行終端,實時顯示日志:
tail -f test.log
效果如下圖:
準備賬戶
部署智能合約需要一個外部賬戶,我們先來看看分配的開發(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)賬
我們知道沒有余額的賬戶是沒法部署合約的,那我們就從默認賬戶轉(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行:準備付的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é)合當前區(qū)塊鏈發(fā)展實際與人才需求結(jié)構(gòu),重磅推出CDA區(qū)塊鏈學(xué)院。
掃描二維碼,進入 CDA 區(qū)塊鏈學(xué)院,學(xué)習(xí)區(qū)塊鏈知識,選擇很多,站對未來
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學(xué)領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學(xué)計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學(xué)計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10