摘要:需要注意,挖一個區塊,獲得個以太幣作為獎勵,這里的顯示的單位是,并不是以太幣,下面轉換一下個以太幣在,現在轉個給,轉賬時候,單位是,但是注意,既然轉賬,別忘先解鎖賬戶,這里要輸入賬戶密碼。
建立基于以太坊的私有網絡和智能合約
寫在前面本文歡迎轉載,轉載請標明出處
freewolf 資深IT從業者,關注微服務、區塊鏈、敏捷開發、前端技術等,不是大神,只是出于熱愛。有問題可以到 https://github.com/freew01f/blog 進行交流。
發布時間 BiTCoin #480499
最近一段時間一直關注區塊鏈的相關的領域和知識,今天本來想幫助小伙伴建立一個基于以太坊的智能合約Demo,發現很多過去的文檔都已經過時了,無法正常工作。那就只能自己造個輪子,弄個版本新一些幫助大家入門。
目標本文以流程tutorial為主,不過多去講技術原理,原理文章網絡大把。
本文目標如下:
建立私有以太坊,設置第一個節點,挖礦
完成一筆轉賬交易
建立簡單的智能合約
建立第二個網絡節點
環境介紹無論什么開發都離不開相應的環境,我盡可能將所有軟件都升級到最新版本,以下是本文內容相關的環境:
操作系統 MacOS 10.12.6
Geth 以太坊 CLI https://github.com/ethereum/g... v1.67
Solidity 智能合約編譯器 Version: 0.4.15+commit.8b45bddb.Darwin.appleclang
安裝安裝Node.js,這里不闡述了,源代碼自己編譯吧。
安裝Geth,這里直接去官方網站下載最新的可執行程序,復制到/usr/local/bin,就OK。
最后安裝Solidity,本地要先有brew,才能進行安裝:
brew tap ethereum/ethereum brew install solidity創建區塊鏈
創建自己的以太坊私有鏈很簡單,新建一個目錄,在目錄中先建立自己的創世區塊描述genesis.json文件。
文件內容如下
{ "config": { "chainId": 2017, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "100", "gasLimit": "2000000", "alloc": {} }
為什么自己創建創世區塊描述,如果使用默認值,difficulty值非常高,這樣挖礦要急死人的。
首先創建兩個賬戶,本文后面需要用到這兩個賬戶,創建賬戶需要輸入兩次密碼。
? > geth --datadir node1 account new ? > geth --datadir node1 account new
用我們剛剛創建的描述文件,創建創世區塊。
? > geth --datadir node1 --networkid 27027 init genesis.json
使用console連接節點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賬戶,也就是挖礦的收益歸集賬戶,現在我們就來挖礦,賺取獎勵,由于difficulty值很低,挖礦秒出基本。
> miner.start(2);admin.sleepBlocks(1);miner.stop(); true
miner.start(2) 開始挖礦,參數是開啟挖礦的計算的線程數
admin.sleepBlocks(1) 挖到1個區塊就停止
miner.stop() 挖礦停止
第一次會創建DAG ,這里會花費一些時間,關于DAG,詳情見底部參考。出現true說明挖礦完畢,挖完查詢余額。
> eth.getBalance(eth.accounts[0]) 5000000000000000000
需要注意,挖一個區塊,獲得5個以太幣作為獎勵,這里的顯示的單位是wei,并不是以太幣,下面轉換一下
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") 5
5個以太幣在accounts[0],現在轉2個給accounts[1],轉賬時候,單位是wei,但是注意,既然轉賬,別忘先解鎖賬戶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"
最后出現的是這個交易的hash,查一下有沒有待處理的交易
> txpool.status { pending: 1, queued: 0 } > web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") 0
果然有一筆pending,查詢賬戶accounts[1],并沒有發現以太幣,這里需要曠工來挖礦,打包這個交易到最新區塊。交易才能生效,繼續挖
> miner.start(2);admin.sleepBlocks(1);miner.stop(); true
查下余額
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") 2
已經到賬,再看下剛才交易的詳情
> 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 }
到這里整個交易就完成了
簡單的智能合約下面我們來創建一個極簡單的智能合約,geth 1.6變化蠻大的,以前編譯智能合約的方法都有一些問題,沒什么簡單的辦法,browser-solidity是個不錯的在線編譯選擇,我們還是選擇在本地進行操作,前面已經通過brew安裝了solidity,創建一個contract文件夾,在文件夾中創建一個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文件就是智能合約相關的接口,bin文件就是智能合約編譯代碼。
這里是Mac命令行環境,不是geth,? > 開頭的都是命令行
? > solc -o . --bin --abi hello.sol ? > ls Hello.abi Hello.bin hello.sol
在geth中加載這些文件很復雜,這里我們修改下剛生成的文件
Hello.abi 文件內容修改成
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 文件內容修改成
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
現在智能合約已經部署到區塊鏈上了,但是要挖礦才能生效,挖完就可以盡情玩耍了。
> 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"]追加 - 如何建立其他節點
追加一段,如何創建其他的P2P節點,首先在原先節點執行下面代碼,查看當前節點信息
> 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相關信息,就可以創建新節點了,這里就不過多解釋了,前面基本都介紹過了
? > 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后,數據同步后,可以使用下面命令
> eth.getBlock("latest") > admin.peers
以上就可以在第二個節點看到之前節點1的信息了。
參考 & 資源關于DAG http://www.hashcash.org/paper...
智能合約 http://solidity.readthedocs.i...
智能合約開發IDE https://ethereum.github.io/br...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23921.html
摘要:和比特幣協議有所不同的是,以太坊的設計十分靈活,極具適應性。超級賬本區塊鏈的商業應用超級賬本超級賬本是基金會下的眾多項目中的一個。證書頒發機構負責簽發撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開始 一個故事告訴你比特幣的原理及運作機制 這篇文章的定位會比較科普,盡量用類比的方法將比特幣的基本原理講出來...
摘要:目前通常指代基于以太坊或者上的智能合約開發的相關應用。引入以太坊通過的交互流程大致如下總結隨著區塊鏈近些年的大紅大紫,被推上了風口浪尖,本文從技術的角度大致介紹了一下所涉及的技術要點。 當你開始探索區塊鏈開發,需要了解到這些。 showImg(https://segmentfault.com/img/remote/1460000016608233?w=1370&h=389); 一、DA...
摘要:原文發表于以太坊智能合約開發第二篇理解以太坊相關概念很多人都說比特幣是區塊鏈,以太坊是區塊鏈。它是以太坊智能合約的運行環境。是由以太坊節點提供。以太坊社區把基于智能合約的應用稱為去中心化的應用。 原文發表于:以太坊智能合約開發第二篇:理解以太坊相關概念 很多人都說比特幣是區塊鏈1.0,以太坊是區塊鏈2.0。在以太坊平臺上,可以開發各種各樣的去中心化應用,這些應用構成了以太坊的整個生態...
摘要:以太坊是什么以太坊是一個建立在區塊鏈技術之上,去中心化應用平臺。運行環境以太坊虛擬機是以太坊中智能合約的運行環境。是由以太坊客戶端提供的是典型的開發以太坊時使用的客戶端,基于語言開發。 本文首發于深入淺出區塊鏈社區原文鏈接:以太坊是什么 - 以太坊開發入門指南原文已更新,請讀者前往原文閱讀 很多同學已經躍躍欲試投入到區塊鏈開發隊伍當中來,可是又感覺無從下手,本文將基于以太坊平臺,以通俗...
摘要:在區塊鏈所面臨的諸多問題中,區塊鏈之間互通性極大程度的限制了區塊鏈的應用空間。是在以太坊基金會支持之下誕生并成長起來的,它被認為是區塊鏈上的第一個側鏈。它旨在解決當今兩大阻止區塊鏈技術傳播和接受的難題即時拓展性和延伸性。 在區塊鏈所面臨的諸多問題中,區塊鏈之間互通性極大程度的限制了區塊鏈的應用空間。對于公有鏈還是私有鏈來說,跨鏈技術就是實現區塊鏈價值的關鍵,是區塊鏈向外拓展和連接的橋梁...
閱讀 2989·2023-04-25 21:23
閱讀 3022·2021-09-22 15:24
閱讀 862·2019-08-30 12:55
閱讀 2095·2019-08-29 18:42
閱讀 2607·2019-08-29 16:27
閱讀 943·2019-08-26 17:40
閱讀 2173·2019-08-26 13:29
閱讀 2604·2019-08-26 11:45