首先安裝go環境 https://golang.org/dl/ 直接用安裝包安裝。
完成後看下
go env
然後關注下gopath路徑,
GOPATH="/Users/MacPro/box/
我們要把go版用戶端放這裡,go編譯器執行都是去設定好的目錄執行。以後寫go的時候項目也要放這裡。
下載go版以太坊用戶端
git clone https://github.com/ethereum/go-ethereum
cd go-ethereum
make geth
編譯成功以後開始以太坊本地測試
先用命令看下,是否成功,
build/bin/geth -h
如果直接用geth 需要做下環境變數
export PATH=$PATH:/全路徑/build/bin/geth
開始搭建私人測試鏈
1 找一個目錄存放挖礦資料 /home/vagrant/
2 建立創世塊設定檔
vim genesis.json
{"config": { "chainId": 1024, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0},"nonce": "0x0000000000000042","difficulty": "0x020000","mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000","coinbase": "0x0000000000000000000000000000000000000000","timestamp": "0x00","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa","gasLimit": "0xffffffff","alloc": {}}
3 初始化配置
geth --datadir data init genesis.json
4 啟動節點
geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console
各參數代表的含義如下:
networkid 設定當前區塊鏈的網路ID,用於區分不同的網路,1表示公鏈
rpc 表示啟動rpc通訊,可以進行智能合約的部署和調試
console 表示啟動命令列模式,可以在Geth中執行命令
執行成功後將進入區塊鏈的JavaScript控制台環境
5 Geth JavaScript控制台環境使用說明
建立新帳號
personal.newAccount() 或 personal.newAccount("123456")
查看節點資訊
admin.nodeInfo
挖礦
開始挖礦 miner.start(1)
停止挖礦 miner.stop()
查看當前礦工帳號
eth.coinbase
預設為第一個賬戶
修改礦工帳號
miner.setEtherbase(eth.accounts[1])
查看賬戶資訊
eth.accounts[0]
查看賬戶餘額
eth.getBalance(eth.accounts[0]) 或者 web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
解鎖帳號
personal.unlockAccount(eth.accounts[0])
使用賬戶資金前都需要先解鎖帳號
轉賬eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(3,"ether")})
使用txpool.status
可以看到交易狀態
查看區塊資料
eth.blockNumber
eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825")
eth.getBlock(1)
通過區塊號查看區塊
可以開一個視窗挖礦,再開一個視窗做交易。
build/bin/geth attach ipc:/Users/MacPro/go_project/src/github.com/ethereum/go-ethereum/data/geth.ipc
6 智能合約
建立一個solidity 編寫的 Token.sol 檔案,內容如下:
contract Token { address issuer; mapping (address => uint) balances; event Issue(address account, uint amount); event Transfer(address from, address to, uint amount); function Token() { issuer = msg.sender; } function issue(address account, uint amount) { if (msg.sender != issuer) throw; balances[account] += amount; } function transfer(address to, uint amount) { if (balances[msg.sender] < amount) throw; balances[msg.sender] -= amount; balances[to] += amount; Transfer(msg.sender, to, amount); } function getBalance(address account) constant returns (uint) { return balances[account]; }}
這份代碼實現了一個簡單的Token合約功能。
issue 函數可以向賬戶直接存放token
transfer 函數可以向其他帳號發送token
getBalance 函數可以擷取某個帳號的token餘額
從這個合約就能瞭解到,erc20協議就是在以太坊上存一個數字,然後加減所謂交易,其他的其實也做不了更多。
7部署合約
先到http://remix.ethereum.org/上編譯測試合約,會產生一個web3格式的部署代碼
先解鎖
personal.unlockAccount(eth.accounts[0])
點擊details 左邊WEB3DEPLOY下代碼複製到geth視窗
然後貼代碼斷行符號
成功以後 執行 token 看下abi資料
開始執行合約方法
此時挖礦程式要一直工作
>token.issue(eth.accounts[0],30,{from: eth.accounts[0]})"0xae0fafd672cfcbaf3bf717a2dee49db3017d4da87cb3e087f2b3e2f28f933cf7">token.getBalance(eth.accounts[0])100> token.transfer(eth.accounts[1], 30, {from: eth.accounts[0]})"0x0df5fb59e8c96cb0884db40163f50fba9d65ad6e03080c21ba7d9fc2ca9663f0"> token.getBalance(eth.accounts[1])30
參考文章
以太坊私鏈與智能合約部署入門教程
以太坊之部署智能合約