以太坊開發--geth的使用入門

一、環境配置和程序安裝

1.1 安裝 geth

MAC OSX

首先確保已安裝 homebrew,沒有安裝過的可以在命令行下執行/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 進行安裝
brew tap ethereum/ethereum
brew install ethereum

WINDOWS

訪問 https://geth.ethereum.org/downloads/
下載並安裝 Geth for Windows

LINUX

git clone https://github.com/ethereum/go-ethereum
sudo apt-get install -y build-essential golang
cd go-ethereum
make geth

在命令行下輸入 geth -h , 有如下回顯表示成功


1.2 安裝 solc

首先確保安裝過npm, 沒有安裝過的可以訪問 npm網站下載安裝
npm install -g solc
在命令行下輸入 solc --help , 有如下回顯表示成功


二、配置私鏈節點

2.1 創世塊設置

新建文件夾,命名隨意,在此文件夾下創建genesis.json文件和data文件夾
genesis.json 的內容如下:

{
"config": {
        "chainId": 123456,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
},
"nonce": "0x0000000000000042",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0x4c4b40",
"alloc": {}
}


2.2 初始化

在命令行下進入剛纔創建的文件夾,輸入如下命令:
geth --datadir data init genesis.json

各參數代表的含義如下:

init 表示初始化區塊,後面跟着創世塊的配置文件genesis.json
datadir 數據存放的位置

2.3 啓動節點

geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console

各參數代表的含義如下:

networkid 設置當前區塊鏈的網絡ID,用於區分不同的網絡,1表示公鏈
rpc 表示啓動rpc通信,可以進行智能合約的部署和調試
console 表示啓動命令行模式,可以在Geth中執行命令

執行成功後將進入區塊鏈的JavaScript控制檯環境


2.4 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:"0x587e57a516730381958f86703b1f8e970ff445d9",value:web3.toWei(3,"ether")})
使用 txpool.status 可以看到交易狀態

查看區塊數據
eth.blockNumber
eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825")
eth.getBlock(1) 通過區塊號查看區塊

三、智能合約

3.1 編輯合約代碼

創建一個 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 函數可以向充值以太到合約賬戶
transfer 函數可以向其他賬號發送token
getBalance 函數可以獲取某個賬號的token餘額

3.2 編譯與部署

壓縮合約代碼
命令行下執行 cat Token.sol | tr '\n' ' '
這條命令將代碼中的換行符替換成空格,這樣我們的代碼就只有一行了。命令執行成功後將回顯複製下來。

將合約代碼保存爲一個變量
回到Geth JavaScript 控制檯,執行如下命令,等於號後面的內容就是我們剛纔複製下來的壓縮後的合約代碼。

var tokenSource = '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]; } }';

編譯
var tokenCompiled = eth.compile.solidity(tokenSource);

若不成功,請參考https://ethereum.stackexchange.com/questions/15435/how-to-compile-solidity-contracts-with-geth-v1-6提供的替代方案

查看二進制代碼
tokenCompiled['<stdin>:Token'].code

查看ABI
tokenCompiled['<stdin>:Token'].info.abiDefinition

創建合約對象
var contract = eth.contract(tokenCompiled['<stdin>:Token'].info.abiDefinition);
var initializer = {from: web3.eth.accounts[0], data: tokenCompiled['<stdin>:Token'].code, gas: 300000};
var token = contract.new(initializer)

輸入命令 token 可以看到此時的token有transactionHash 但是沒有address
執行 miner.start(1) 一段時間後停止,我們的合約就發佈到了鏈上

3.3 與合約進行交互

充值

personal.unlockAccount(eth.accounts[0])
token.issue.sendTransaction(eth.accounts[0], 100, {from: eth.accounts[0]});
miner.start(1)
miner.stop()

發送 token

token.transfer(eth.accounts[1], 30, {from: eth.accounts[0]})
miner.start(1)
miner.stop()

查看餘額

token.getBalance()

命令用法

geth [選項] 命令 [命令選項] [參數…]

版本:

1.7.3-stable

命令:

account    管理賬戶

attach    啓動交互式JavaScript環境(連接到節點)

bug        上報bug Issues

console    啓動交互式JavaScript環境

copydb    從文件夾創建本地鏈

dump      Dump(分析)一個特定的塊存儲

dumpconfig 顯示配置值

export    導出區塊鏈到文件

import    導入一個區塊鏈文件

init      啓動並初始化一個新的創世紀塊

js        執行指定的JavaScript文件(多個)

license    顯示許可信息

makecache  生成ethash驗證緩存(用於測試)

makedag    生成ethash 挖礦DAG(用於測試)

monitor    監控和可視化節點指標

removedb  刪除區塊鏈和狀態數據庫

version    打印版本號

wallet    管理Ethereum預售錢包

help,h    顯示一個命令或幫助一個命令列表

ETHEREUM選項:

--config value          TOML 配置文件

--datadir “xxx”        數據庫和keystore密鑰的數據目錄

--keystore              keystore存放目錄(默認在datadir內)

--nousb                禁用監控和管理USB硬件錢包

--networkid value      網絡標識符(整型, 1=Frontier, 2=Morden (棄用), 3=Ropsten, 4=Rinkeby) (默認: 1)

--testnet              Ropsten網絡:預先配置的POW(proof-of-work)測試網絡

--rinkeby              Rinkeby網絡: 預先配置的POA(proof-of-authority)測試網絡

--syncmode "fast"      同步模式 ("fast", "full", or "light")

--ethstats value        上報ethstats service  URL (nodename:secret@host:port)

--identity value        自定義節點名

--lightserv value      允許LES請求時間最大百分比(0 – 90)(默認值:0)

--lightpeers value      最大LES client peers數量(默認值:20)

--lightkdf              在KDF強度消費時降低key-derivation RAM&CPU使用

開發者(模式)選項:

--dev              使用POA共識網絡,默認預分配一個開發者賬戶並且會自動開啓挖礦。

--dev.period value  開發者模式下挖礦週期 (0 = 僅在交易時) (默認: 0)

ETHASH 選項:

--ethash.cachedir                        ethash驗證緩存目錄(默認 = datadir目錄內)

--ethash.cachesinmem value              在內存保存的最近的ethash緩存個數  (每個緩存16MB ) (默認: 2)

--ethash.cachesondisk value              在磁盤保存的最近的ethash緩存個數 (每個緩存16MB) (默認: 3)

--ethash.dagdir ""                      存ethash DAGs目錄 (默認 = 用戶hom目錄)

--ethash.dagsinmem value                在內存保存的最近的ethash DAGs 個數 (每個1GB以上) (默認: 1)

--ethash.dagsondisk value                在磁盤保存的最近的ethash DAGs 個數 (每個1GB以上) (默認: 2)

交易池選項:

--txpool.nolocals            爲本地提交交易禁用價格豁免

--txpool.journal value      本地交易的磁盤日誌:用於節點重啓 (默認: "transactions.rlp")

--txpool.rejournal value    重新生成本地交易日誌的時間間隔 (默認: 1小時)

--txpool.pricelimit value    加入交易池的最小的gas價格限制(默認: 1)

--txpool.pricebump value    價格波動百分比(相對之前已有交易) (默認: 10)

--txpool.accountslots value  每個帳戶保證可執行的最少交易槽數量  (默認: 16)

--txpool.globalslots value  所有帳戶可執行的最大交易槽數量 (默認: 4096)

--txpool.accountqueue value  每個帳戶允許的最多非可執行交易槽數量 (默認: 64)

--txpool.globalqueue value  所有帳戶非可執行交易最大槽數量  (默認: 1024)

--txpool.lifetime value      非可執行交易最大入隊時間(默認: 3小時)

性能調優的選項:

--cache value                分配給內部緩存的內存MB數量,緩存值(最低16 mb /數據庫強制要求)(默認:128)

--trie-cache-gens value      保持在內存中產生的trie node數量(默認:120)

帳戶選項:

--unlock value              需解鎖賬戶用逗號分隔

--password value            用於非交互式密碼輸入的密碼文件

API和控制檯選項:

--rpc                      啓用HTTP-RPC服務器

--rpcaddr value            HTTP-RPC服務器接口地址(默認值:“localhost”)

--rpcport value            HTTP-RPC服務器監聽端口(默認值:8545)

--rpcapi value              基於HTTP-RPC接口提供的API

--ws                        啓用WS-RPC服務器

--wsaddr value              WS-RPC服務器監聽接口地址(默認值:“localhost”)

--wsport value              WS-RPC服務器監聽端口(默認值:8546)

--wsapi  value              基於WS-RPC的接口提供的API

--wsorigins value          websockets請求允許的源

--ipcdisable                禁用IPC-RPC服務器

--ipcpath                  包含在datadir裏的IPC socket/pipe文件名(轉義過的顯式路徑)

--rpccorsdomain value      允許跨域請求的域名列表(逗號分隔)(瀏覽器強制)

--jspath loadScript        JavaScript加載腳本的根路徑(默認值:“.”)

--exec value                執行JavaScript語句(只能結合console/attach使用)

--preload value            預加載到控制檯的JavaScript文件列表(逗號分隔)

網絡選項:

--bootnodes value    用於P2P發現引導的enode urls(逗號分隔)(對於light servers用v4+v5代替)

--bootnodesv4 value  用於P2P v4發現引導的enode urls(逗號分隔) (light server, 全節點)

--bootnodesv5 value  用於P2P v5發現引導的enode urls(逗號分隔) (light server, 輕節點)

--port value        網卡監聽端口(默認值:30303)

--maxpeers value    最大的網絡節點數量(如果設置爲0,網絡將被禁用)(默認值:25)

--maxpendpeers value    最大嘗試連接的數量(如果設置爲0,則將使用默認值)(默認值:0)

--nat value            NAT端口映射機制 (any|none|upnp|pmp|extip:) (默認: “any”)

--nodiscover            禁用節點發現機制(手動添加節點)

--v5disc                啓用實驗性的RLPx V5(Topic發現)機制

--nodekey value        P2P節點密鑰文件

--nodekeyhex value      十六進制的P2P節點密鑰(用於測試)

礦工選項:

--mine                  打開挖礦

--minerthreads value    挖礦使用的CPU線程數量(默認值:8)

--etherbase value      挖礦獎勵地址(默認=第一個創建的帳戶)(默認值:“0”)

--targetgaslimit value  目標gas限制:設置最低gas限制(低於這個不會被挖?) (默認值:“4712388”)

--gasprice value        挖礦接受交易的最低gas價格

--extradata value      礦工設置的額外塊數據(默認=client version)

GAS價格選項:

--gpoblocks value      用於檢查gas價格的最近塊的個數  (默認: 10)

--gpopercentile value  建議gas價參考最近交易的gas價的百分位數,(默認: 50)

虛擬機的選項:

--vmdebug        記錄VM及合約調試信息

日誌和調試選項:

--metrics            啓用metrics收集和報告

--fakepow            禁用proof-of-work驗證

--verbosity value    日誌詳細度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)

--vmodule value      每個模塊詳細度:以 =的逗號分隔列表 (比如 eth/*=6,p2p=5)

--backtrace value    請求特定日誌記錄堆棧跟蹤 (比如 “block.go:271”)

--debug                    突出顯示調用位置日誌(文件名及行號)

--pprof                    啓用pprof HTTP服務器

--pprofaddr value          pprof HTTP服務器監聽接口(默認值:127.0.0.1)

--pprofport value          pprof HTTP服務器監聽端口(默認值:6060)

--memprofilerate value      按指定頻率打開memory profiling    (默認:524288)

--blockprofilerate value    按指定頻率打開block profiling    (默認值:0)

--cpuprofile value          將CPU profile寫入指定文件

--trace value              將execution trace寫入指定文件

WHISPER實驗選項:

--shh                        啓用Whisper

--shh.maxmessagesize value  可接受的最大的消息大小 (默認值: 1048576)

--shh.pow value              可接受的最小的POW (默認值: 0.2)

棄用選項:

--fast    開啓快速同步

--light    啓用輕客戶端模式

其他選項:

–help, -h    顯示幫助


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章