建立基于以太坊的私有網(wǎng)絡(luò)和智能合約

本文歡迎轉(zhuǎn)載,轉(zhuǎn)載請標明出處

freewolf 資深I(lǐng)T從業(yè)者公条,關(guān)注微服務(wù)拇囊、區(qū)塊鏈敏捷開發(fā)靶橱、前端技術(shù)等寥袭,不是大神,只是出于熱愛关霸。有問題可以到 https://github.com/freew01f/blog 進行交流传黄。

發(fā)布時間 BiTCoin #480499

寫在前面

最近一段時間一直關(guān)注區(qū)塊鏈的相關(guān)的領(lǐng)域和知識,今天本來想幫助小伙伴建立一個基于以太坊的智能合約Demo队寇,發(fā)現(xiàn)很多過去的文檔都已經(jīng)過時了膘掰,無法正常工作。那就只能自己造個輪子,弄個版本新一些幫助大家入門识埋。

本文以流程tutorial為主凡伊,不過多去講技術(shù)原理,原理文章網(wǎng)絡(luò)大把窒舟。

目標

本文目標如下:

  • 建立私有以太坊系忙,設(shè)置第一個節(jié)點惠豺,挖礦
  • 完成一筆轉(zhuǎn)賬交易
  • 建立簡單的智能合約
  • 建立第二個網(wǎng)絡(luò)節(jié)點

環(huán)境介紹

無論什么開發(fā)都離不開相應(yīng)的環(huán)境,我盡可能將所有軟件都升級到最新版本洁墙,以下是本文內(nèi)容相關(guān)的環(huán)境:

安裝

安裝Node.js,這里不闡述了热监,源代碼自己編譯吧捺弦。
安裝Geth孝扛,這里直接去官方網(wǎng)站下載最新的可執(zhí)行程序,復(fù)制到/usr/local/bin疗琉,就OK歉铝。
最后安裝Solidity,本地要先有brew太示,才能進行安裝:

brew tap ethereum/ethereum
brew install solidity

創(chuàng)建區(qū)塊鏈

創(chuàng)建自己的以太坊私有鏈很簡單,新建一個目錄类缤,在目錄中先建立自己的創(chuàng)世區(qū)塊描述genesis.json文件臼勉。

文件內(nèi)容如下

{
  "config": {
    "chainId": 2017,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "difficulty": "100",
  "gasLimit": "2000000",
  "alloc": {}
}

為什么自己創(chuàng)建創(chuàng)世區(qū)塊描述,如果使用默認值餐弱,difficulty值非常高宴霸,這樣挖礦要急死人的。

首先創(chuàng)建兩個賬戶膏蚓,本文后面需要用到這兩個賬戶瓢谢,創(chuàng)建賬戶需要輸入兩次密碼。

?? > geth --datadir node1 account new
?? > geth --datadir node1 account new

用我們剛剛創(chuàng)建的描述文件驮瞧,創(chuàng)建創(chuàng)世區(qū)塊氓扛。

?? > geth --datadir node1 --networkid 27027 init genesis.json

使用console連接節(jié)點1并且記錄log

?? > geth --datadir node1 --networkid 27027 console 2>>geth.log

使用geth完成挖礦和交易

連接成功后,看看有幾個賬戶

> eth.accounts
["0x65070d1d224114fd3c8358e9614fd948daecc428", "0xf11167054eb5fb91dd7b46726380f0f0cb09a6d8"]

查詢下賬戶余額

> eth.getBalance(eth.accounts[0])
0

第一個賬戶沒有余額论笔,accounts[0]默認情況是coinbase賬戶采郎,也就是挖礦的收益歸集賬戶千所,現(xiàn)在我們就來挖礦,賺取獎勵蒜埋,由于difficulty值很低淫痰,挖礦秒出基本。

> miner.start(2);admin.sleepBlocks(1);miner.stop();
true
  • miner.start(2) 開始挖礦理茎,參數(shù)是開啟挖礦的計算的線程數(shù)
  • admin.sleepBlocks(1) 挖到1個區(qū)塊就停止
  • miner.stop() 挖礦停止

第一次會創(chuàng)建DAG 黑界,這里會花費一些時間,關(guān)于DAG皂林,詳情見底部參考朗鸠。出現(xiàn)true說明挖礦完畢,挖完查詢余額础倍。

> eth.getBalance(eth.accounts[0])
5000000000000000000

需要注意烛占,挖一個區(qū)塊,獲得5個以太幣作為獎勵沟启,這里的顯示的單位是wei忆家,并不是以太幣,下面轉(zhuǎn)換一下

> web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
5

5個以太幣在accounts[0]德迹,現(xiàn)在轉(zhuǎn)2個給accounts[1]芽卿,轉(zhuǎn)賬時候,單位是wei胳搞,但是注意卸例,既然轉(zhuǎn)賬,別忘先解鎖賬戶accounts[0]肌毅,這里要輸入賬戶密碼筷转。

> personal.unlockAccount(eth.accounts[0])
Unlock account 0x65070d1d224114fd3c8358e9614fd948daecc428
Passphrase:
true
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(2, "ether")})
"0x3f190d2af25dff4e6b6fac9537f8f6152fdb193ca9afe228fbdc9301bbff5645"

最后出現(xiàn)的是這個交易的hash呜舒,查一下有沒有待處理的交易

> txpool.status
{
  pending: 1,
  queued: 0
}
> web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether')
0

果然有一筆pending笨奠,查詢賬戶accounts[1],并沒有發(fā)現(xiàn)以太幣般婆,這里需要曠工來挖礦,打包這個交易到最新區(qū)塊左电。交易才能生效,繼續(xù)挖

> miner.start(2);admin.sleepBlocks(1);miner.stop();
true

查下余額

> web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether')
2

已經(jīng)到賬段誊,再看下剛才交易的詳情

> eth.getTransaction("0x3f190d2af25dff4e6b6fac9537f8f6152fdb193ca9afe228fbdc9301bbff5645")
{
  blockHash: "0xd30fbefb48de05a458a909d9486402bfa4d1459619226a3f8b95aaf407669bb7",
  blockNumber: 2,
  from: "0x65070d1d224114fd3c8358e9614fd948daecc428",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0x3f190d2af25dff4e6b6fac9537f8f6152fdb193ca9afe228fbdc9301bbff5645",
  input: "0x",
  nonce: 0,
  r: "0xd9b7c4830b9a7ae8ac922179c4e73e6bf2a52178ee0c01250bd940586334d412",
  s: "0xa1b0058b63e1c0360eae6073791b1d63d4a737c71c5932b4b203e853a8185cd",
  to: "0xf11167054eb5fb91dd7b46726380f0f0cb09a6d8",
  transactionIndex: 0,
  v: "0xfe5",
  value: 2000000000000000000
}

到這里整個交易就完成了

簡單的智能合約

下面我們來創(chuàng)建一個極簡單的智能合約连舍,geth 1.6變化蠻大的涩哟,以前編譯智能合約的方法都有一些問題,沒什么簡單的辦法潜腻,browser-solidity是個不錯的在線編譯選擇,我們還是選擇在本地進行操作器仗,前面已經(jīng)通過brew安裝了solidity,創(chuàng)建一個contract文件夾精钮,在文件夾中創(chuàng)建一個hello.sol智能合約文件

pragma solidity ^0.4.13;

contract Hello {
  function sum(uint _a, uint _b) returns (uint o_sum, string o_author) {
    o_sum = _a + _b;
    o_author = "freewolf";
  }
}

然后我們來編譯,完成后轨香,會多出兩個文件,abi文件就是智能合約相關(guān)的接口臂容,bin文件就是智能合約編譯代碼。

這里是Mac命令行環(huán)境,不是geth娜亿,?? >開頭的都是命令行

?? > solc -o . --bin --abi hello.sol
?? > ls
Hello.abi   Hello.bin   hello.sol

geth中加載這些文件很復(fù)雜,這里我們修改下剛生成的文件

Hello.abi 文件內(nèi)容修改成

var HelloContract = eth.contract([{"constant":false,"inputs":[{"name":"_a","type":"uint256"},{"name":"_b","type":"uint256"}],"name":"sum","outputs":[{"name":"o_sum","type":"uint256"},{"name":"o_author","type":"string"}],"payable":false,"type":"function"}])

Hello.bin 文件內(nèi)容修改成

personal.unlockAccount(eth.accounts[0])

var hello = HelloContract.new({
  from: eth.accounts[0],
  data: "0x6060604052341561000f57600080fd5b5b61017a8061001f6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cad0899b1461003e575b600080fd5b341561004957600080fd5b61006860048080359060200190919080359060200190919050506100eb565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156100af5780820151818401525b602081019050610093565b50505050905090810190601f1680156100dc5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b60006100f561013a565b82840191506040805190810160405280600881526020017f66726565776f6c6600000000000000000000000000000000000000000000000081525090505b9250929050565b6020604051908101604052806000815250905600a165627a7a72305820063cb95e17166637bd4ab62eae6b0e6c4e1fcd85a9c2e3be29aa75a272280b830029",
  gas: 500000
})

注意別忘了data必須0x開頭沛婴,New合約就得解鎖自己的賬戶嘁灯,這里解鎖也寫在這里了

回到geth躲舌,加載剛修改的文件,加載bin文件需要輸入賬戶密碼

文件夾contract就在運行geth命令的目錄

> loadScript("contract/Hello.abi")
true
> loadScript("contract/Hello.bin")
Unlock account 0x65070d1d224114fd3c8358e9614fd948daecc428
Passphrase:
true

現(xiàn)在智能合約已經(jīng)部署到區(qū)塊鏈上了羹奉,但是要挖礦才能生效,挖完就可以盡情玩耍了迁筛。

> hello
{
  abi: [{
      constant: false,
      inputs: [{...}, {...}],
      name: "sum",
      outputs: [{...}, {...}],
      payable: false,
      type: "function"
  }],
  address: undefined,
  transactionHash: "0x783f5cae1f9b40f25da1260267d5e6f801d1746541b5f28f84684883723807b8"
}
> hello.sum
undefined
> miner.start(1);admin.sleepBlocks(1);miner.stop();
true
> hello.sum
function()
> hello.sum.call(1,2)
[3, "freewolf"]

追加 - 如何建立其他節(jié)點

追加一段耕挨,如何創(chuàng)建其他的P2P節(jié)點,首先在原先節(jié)點執(zhí)行下面代碼贪庙,查看當前節(jié)點信息

> admin.nodeInfo
{
  enode: "enode://bbd3d0f2afad68c3e4b2e79a6daddc6e8498b9266cc3e953bbb121bae40fe44b5e0377c0768b03e47ac04cead52235a12931bfb96528a8225be5808fc8c174b3@192.168.1.2:30303",
  id: "bbd3d0f2afad68c3e4b2e79a6daddc6e8498b9266cc3e953bbb121bae40fe44b5e0377c0768b03e47ac04cead52235a12931bfb96528a8225be5808fc8c174b3",
  ip: "192.168.1.2",
  listenAddr: "[::]:30303",
  name: "Geth/v1.6.7-stable-ab5646c5/darwin-amd64/go1.8.3",
  ports: {
    discovery: 30303,
    listener: 30303
  },
  protocols: {
    eth: {
      difficulty: 655652,
      genesis: "0x7b0286b147e6b5b8710b8acff38053fdf1991a980da8ca73b4b359c28c7144fc",
      head: "0xd545cee3b9247b67c5d43728eddcbcfe9315dcf18cbc12187a7a178220829153",
      network: 27027
    }
  }
}

拿到node相關(guān)信息插勤,就可以創(chuàng)建新節(jié)點了农尖,這里就不過多解釋了,前面基本都介紹過了

?? > mkdir node2
?? > geth --datadir node2 account new
?? > geth --datadir node2 --networkid 27027 init genesis.json
?? > geth --datadir node2 --networkid 27027 --port 30304 --bootnodes "enode://bbd3d0f2afad68c3e4b2e79a6daddc6e8498b9266cc3e953bbb121bae40fe44b5e0377c0768b03e47ac04cead52235a12931bfb96528a8225be5808fc8c174b3@192.168.1.2:30303" console

需要注意的也就是最后一行盛卡,寫入你自己的node信息滑沧,其他的也沒什么了巍实,進入geth后,數(shù)據(jù)同步后棚潦,可以使用下面命令

> eth.getBlock('latest')
> admin.peers

以上就可以在第二個節(jié)點看到之前節(jié)點1的信息了丸边。

參考 & 資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妹窖,一起剝皮案震驚了整個濱河市骄呼,隨后出現(xiàn)的幾起案子判没,更是在濱河造成了極大的恐慌俄讹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊阀,死亡現(xiàn)場離奇詭異胞此,居然都是意外死亡跃捣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門酣胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闻镶,“玉大人丸升,你說我怎么就攤上這事〗瞥埽” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵岭皂,是天一觀的道長沼头。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么庄撮? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任洞斯,我火速辦了婚禮坑赡,結(jié)果婚禮上么抗,老公的妹妹穿的比我還像新娘。我一直安慰自己螟加,他們只是感情好吞琐,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布站粟。 她就那樣靜靜地躺著,像睡著了一般助被。 火紅的嫁衣襯著肌膚如雪切诀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天检盼,我揣著相機與錄音吨枉,去河邊找鬼哄芜。 笑死,一個胖子當著我的面吹牛圃庭,可吹牛的內(nèi)容都是我干的剧腻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼书在,長吁一口氣:“原來是場噩夢啊……” “哼儒旬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挡爵,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茶鹃,失蹤者是張志新(化名)和其女友劉穎制轰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體男杈,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡伶棒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年肤无,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宛渐。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡窥翩,死狀恐怖鳞仙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仗岸,我是刑警寧澤借笙,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盗痒,受9級特大地震影響积糯,放射性物質(zhì)發(fā)生泄漏谦纱。R本人自食惡果不足惜跨嘉,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梦重。 院中可真熱鬧琴拧,春花似錦、人聲如沸蚓胸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倚舀。三九已至叹哭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞄桨,已是汗流浹背话速。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芯侥,地道東北人泊交。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像柱查,于是被迫代替她去往敵國和親廓俭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 簡介 不管你們知不知道以太坊(Ethereum blockchain)是什么唉工,但是你們大概都聽說過以太坊研乒。最近在新...
    Lilymoana閱讀 3,892評論 1 22
  • 本文是對以太坊文檔 Ethereum Frontier Guide 和 Ethereum Homestead 的整...
    趁風(fēng)卷閱讀 9,522評論 0 16
  • 一、區(qū)塊鏈 1. 分布式去中心化 比特幣設(shè)計的初衷就是要避免依賴中心化的機構(gòu)雹熬,沒有發(fā)行機構(gòu)铅乡,也不可能操縱發(fā)行數(shù)量阵幸。...
    Tenny1225閱讀 33,686評論 5 35
  • 奇葩說的最新辯題,分手要不要見面济瓢,全程戳心的不單單是話題涨共,還有范甜甜那哭紅的眼举反。想起幾天前閑聊的時候素素說過的一句...
    芬芬vstar閱讀 409評論 1 5
  • 1從最早的共濟會的神秘源頭德魯伊密教雕崩,到后來的圣殿騎士團盼铁、骷髏會鹏控、黑手黨当辐、光明會缘揪、玫瑰十字會蹈垢、錫安會等耘婚,再到后來活...
    文曦閱讀 545評論 0 1