以太坊私链搭建操作记录


1     私链搭建

1.1   编写genesis.json

{

 "config": {

       "chainId": 168, 

       "homesteadBlock": 0,

       "eip155Block": 0,

       "eip158Block": 0

   },

 "alloc"      : {},

 "coinbase"   :"0x0000000000000000000000000000000000000000",

 "difficulty" : "0x20000",

 "extraData"  :"",

 "gasLimit"   :"0x2fefd8",

 "nonce"      :"0x0000000000000042",

 "mixhash"    :"0x0000000000000000000000000000000000000000000000000000000000000000",

 "parentHash" :"0x0000000000000000000000000000000000000000000000000000000000000000",

 "timestamp"  :"0x00"

}

1.2   初始化创世快

Geth –datadir /home/hlf/eth/data/00 initgenesis.json

hlf@ubuntu:~/eth$ geth --datadir/home/hlf/eth/data/00 init genesis.json

INFO [03-24|23:26:32] Maximum peercount                       ETH=25 LES=0total=25

INFO [03-24|23:26:32] Allocated cache andfile handles        database=/home/hlf/eth/data/00/geth/chaindata cache=16 handles=16

INFO [03-24|23:26:34] Writing custom genesisblock

INFO [03-24|23:26:34] Persisted trie frommemory database      nodes=0 size=0.00Btime=5.673µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [03-24|23:26:34] Successfully wrotegenesis state        database=chaindata                            hash=5e1fc7…d790e0

INFO [03-24|23:26:34] Allocated cache andfile handles        database=/home/hlf/eth/data/00/geth/lightchaindata cache=16 handles=16

INFO [03-24|23:26:34] Writing customgenesis block

INFO [03-24|23:26:34] Persisted trie frommemory database      nodes=0 size=0.00Btime=5.716µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [03-24|23:26:34] Successfully wrotegenesis state        database=lightchaindata                            hash=5e1fc7…d790e0

1.3   创建配置文件

geth --identity “hlfnode” --rpc –datadir /home/hlf/eth/data/00 –port “30303” –rpcapi “db,eth,net,web3”–networkid 168 console dumpconfig > gethconfig.toml

使用dumpconfig命令根据输入参数创建了配置文件,gethconfig.toml。内容如下:

[Eth]

NetworkId = 168

SyncMode = "fast"

LightPeers = 100

DatabaseCache = 768

GasPrice = 18000000000

EnablePreimageRecording = false

[Eth.Ethash]

CacheDir = "ethash"

CachesInMem = 2

CachesOnDisk = 3

DatasetDir = "/home/hlf/.ethash"

DatasetsInMem = 1

DatasetsOnDisk = 2

PowMode = 0

[Eth.TxPool]

NoLocals = false

Journal = "transactions.rlp"

Rejournal = 3600000000000

PriceLimit = 1

PriceBump = 10

AccountSlots = 16

GlobalSlots = 4096

AccountQueue = 64

GlobalQueue = 1024

Lifetime = 10800000000000

[Eth.GPO]

Blocks = 20

Percentile = 60

[Shh]

MaxMessageSize = 1048576

MinimumAcceptedPOW = 2e-01

[Node]

UserIdent = "hlfnode"

DataDir ="/home/hlf/geth/data/00"

IPCPath = "geth.ipc"

HTTPHost = "127.0.0.1"

HTTPPort = 8545

HTTPVirtualHosts = ["localhost"]

HTTPModules = ["db","eth", "net", "web3"]

WSPort = 8546

WSModules = ["net","web3", "eth", "shh"]

[Node.P2P]

MaxPeers = 25

NoDiscovery = false

BootstrapNodes =["enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303","enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303","enode://78de8a0916848093c73790ead81d1928bec737d565119932b98c6b100d944b7a95e94f847f689fc723399d2e31129d182f7ef3863f2b4c820abbf3ab2722344d@191.235.84.50:30303","enode://158f8aab45f6d19c6cbf4a089c2670541a8da11978a2f90dbf6a502a4a3bab80d288afdbeb7ec0ef6d92de563767f3b1ea9e8e334ca711e9f8e2df5a0385e8e6@13.75.154.138:30303","enode://1118980bf48b0a3640bdba04e0fe78b1add18e1cd99bf22d53daac1fd9972ad650df52176e7c7d89d1114cfef2bc23a2959aa54998a46afcf7d91809f0855082@52.74.57.123:30303","enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303"]

BootstrapNodesV5 =["enode://06051a5573c81934c9554ef2898eb13b33a34b94cf36b202b69fde139ca17a85051979867720d4bdae4323d4943ddf9aeeb6643633aa656e0be843659795007a@35.177.226.168:30303","enode://0cc5f5ffb5d9098c8b8c62325f3797f56509bff942704687b6530992ac706e2cb946b90a34f1f19548cd3c7baccbcaea354531e5983c7d1bc0dee16ce4b6440b@40.118.3.223:30304","enode://1c7a64d76c0334b0418c004af2f67c50e36a3be60b5e4790bdac0439d21603469a85fad36f2473c9a80eb043ae60936df905fa28f1ff614c3e5dc34f15dcd2dc@40.118.3.223:30306","enode://85c85d7143ae8bb96924f2b54f1b3e70d8c4d367af305325d30a61385a432f247d2c75c45c6b4a60335060d072d7f5b35dd1d4c45f76941f62a4f83b6e75daaf@40.118.3.223:30307"]

StaticNodes = []

TrustedNodes = []

ListenAddr = ":30303"

EnableMsgEvents = false

[Dashboard]

Host = "localhost"

Port = 8080

Refresh = 5000000000

1.4   启动

geth --identity “hlfnode” --rpc –datadir /home/hlf/eth/data/00 –port “30303” –rpcapi “db,eth,net,web3”–networkid 168 console

或者

geth  --config ./config/gethconfig.toml console

1.5   使用另外的geth attach

geth attach /home/hlf/eth/data/00/geth.ipc

1.6   创建账户

personal.newAccount("11111111")

"0xc6003745e17f91afc01fa1d15ab136f93247e4ce"

1.7   挖矿

miner.start()

miner.stop()

1.8   操作

1.8.1 检查挖出的区块数量

> eth.blockNumber

102

1.8.2 账户的余额

> eth.getBalance(personal.listAccounts[0])

510000000000000000000

1.8.3 账户

> address=eth.accounts[0]

"0xc6003745e17f91afc01fa1d15ab136f93247e4ce"

1.8.4 解锁账户

>personal.unlockAccount(address,"11111111",10000)

2     编写智能合约

2.1   安装solc

2.1.1 安装源

sudo apt-get update

sudo apt-get installsoftware-properties-common

sudo add-apt-repository -y ppa:ethereum/ethereum

sudo add-apt-repository -y ppa:ethereum/ethereum-dev

sudo apt-get update

sudo apt-get install Ethereum (可以不执行,如果执行则会安装geth)

2.1.2 安装solc

sudo apt-get install solc

源代码安装

git clone --recursivehttps://github.com/ethereum/solidity.git

2.2   创建账号

输入:

personal.newAccount(“12345678”)

输出:

"0x6044ed10194c63e3136b5f504a6d4e74f545d627"

12345678为密码,输出为地址

2.3   查看账号余额

myAddress="0xc6003745e17f91afc01fa1d15ab136f93247e4ce"  //--使用该账号密码是:11111111

eth.getBalance(myAddress)

2.4   编写智能合约

2.4.1 编写testContract.sol

testContract.sol

pragma solidity ^0.4.0;

contract testContract {

       functionmultiply(uint a) returns(uint d){

              d= a* 7;

       }

}

2.4.2 获得合约编译后的EVM二级制码

solc --bin testContract.sol

======= testContract.sol:testContract=======

Binary:

6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820565a525585db1df64f2dc06fb89e6a79095be25d42b24d742a109c8329b36b0d0029

2.4.3 获得合约的JSON ABI

solc --abi testContract.sol

======= testContract.sol:testContract=======

Contract JSON ABI

[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

2.4.4 变量记录

回到Geth的javascript环境命令行界面,用变量记录上述两个值。注意在code前加上0x前缀

code=”0x6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820565a525585db1df64f2dc06fb89e6a79095be25d42b24d742a109c8329b36b0d0029”

abi=[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

3     部署智能合约

发送部署合约

myContract=eth.contract(abi)

contract=myContract.new({from:myAddress,data:code,gas:1000000})

解锁账户

personal.unlockAccount(myAddress)

txpool.status看到本地交易池中有一个待确认的交易。也可以使用以下命令查看待确认的交易。

eth.getBlock(“pending”,true).transactions

4     调用智能合约

contract.multiply.sendTransaction(10,{from:myAddress})

contract.multiply.call(10)

5     geth命令

USAGE : geth [options] command [commandoptions] [arguments…]

5.1   commands

Account

Manage accounts

Attach

Start a interactive JavaScript environment(connect to node)

Bug

Open a window to report a bug on the geth repo

Console

Start an interactive JavaScript environment

Copydb

Create a local chain from a target chaindata folder

Dump

Dump a specific block from storage

Dumpconfig

Show configuration values

Export

Export blockchain into file

Import

Import a blockchain file

Init

Bootstrap and initialize a new genesis block

Js

Execute the specified Javascript files

License

Display license information

Makecache

Generate ethash verification cache (for testing)

Makedag

Generate ethash mining DAG (for testing)

Monitor

Monitor and visualize node metrics

Removed

Remove blockchain and state databases

Version

Prient version numbers

Wallet

Manage Ethereum presale wallets

Help, h

Shows a list of commands or help for one command

5.2   ethereum options

--config value

TOML configuration file

--datadir value

Data directory for the databases and keystore

--keystore

Directory for the keystore (default = inside the datadir)

--nousb

Disables monitoring for and managing USB hardware wallets

--networkid value

Network identifier

--testnet

挖矿同时可以用 geth attach 命令打开另一个终端查看账户余额

geth attach$HOME/privateNet/bootnode/geth.ipc

...

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

6     命令

Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。
熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。本文主要是对gethhelp的翻译,基于最新的geth1.7.3-stable版本。

如果你还不知道geth是什么,请先阅读入门篇:以太坊是什么
以下开始正文。

6.1命令用法

geth[选项]命令 [命令选项][参数…]

6.1.1 版本:

1.7.3-stable

6.1.2 命令:

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     显示一个命令或帮助一个命令列表

6.1.3 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使用

6.1.4 开发者(模式)选项:

--dev               使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。
--dev.period value  开发者模式下挖矿周期 (0 = 仅在交易时) (默认: 0)

6.1.5 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)

6.1.6 交易池选项:

--txpool.nolocals            为本地提交交易禁用价格豁免
--txpool.journalvalue       本地交易的磁盘日志:用于节点重启 (默认: "transactions.rlp")
--txpool.rejournalvalue     重新生成本地交易日志的时间间隔 (默认: 1小时)
--txpool.pricelimitvalue    加入交易池的最小的gas价格限制(默认: 1)
--txpool.pricebumpvalue     价格波动百分比(相对之前已有交易) (默认: 10)
--txpool.accountslotsvalue  每个帐户保证可执行的最少交易槽数量  (默认: 16)
--txpool.globalslotsvalue   所有帐户可执行的最大交易槽数量 (默认: 4096)
--txpool.accountqueuevalue  每个帐户允许的最多非可执行交易槽数量 (默认: 64)
--txpool.globalqueuevalue   所有帐户非可执行交易最大槽数量  (默认: 1024)
--txpool.lifetimevalue      非可执行交易最大入队时间(默认: 3小时)

6.1.7 性能调优的选项:

--cache value                分配给内部缓存的内存MB数量,缓存值(最低16 mb /数据库强制要求)(默认:128)
--trie-cache-gens value      保持在内存中产生的trie node数量(默认:120)

6.1.8 帐户选项:

--unlock value              需解锁账户用逗号分隔
--password value            用于非交互式密码输入的密码文件

6.1.9 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文件列表(逗号分隔)

6.1.10        网络选项:

--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:<IP>)(默认: “any”)
--nodiscover            禁用节点发现机制(手动添加节点)
--v5disc                启用实验性的RLPx V5(Topic发现)机制
--nodekey value         P2P节点密钥文件
--nodekeyhex value      十六进制的P2P节点密钥(用于测试)

6.1.11        矿工选项:

--mine                  打开挖矿
--minerthreads value    挖矿使用的CPU线程数量(默认值:8)
--etherbase value       挖矿奖励地址(默认=第一个创建的帐户)(默认值:“0”)
--targetgaslimit value  目标gas限制:设置最低gas限制(低于这个不会被挖?) (默认值:“4712388”)
--gasprice value        挖矿接受交易的最低gas价格
--extradata value       矿工设置的额外块数据(默认=client version)

6.1.12        GAS价格选项:

--gpoblocks value      用于检查gas价格的最近块的个数  (默认: 10)
--gpopercentile value  建议gas价参考最近交易的gas价的百分位数,(默认: 50)

6.1.13        虚拟机的选项:

--vmdebug        记录VM及合约调试信息

6.1.14        日志和调试选项:

--metrics            启用metrics收集和报告
--fakepow            禁用proof-of-work验证
--verbosity value    日志详细度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)
--vmodule value      每个模块详细度:以 <pattern>=<level>的逗号分隔列表 (比如 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写入指定文件

6.1.15        WHISPER实验选项:

--shh                        启用Whisper
--shh.maxmessagesize value   可接受的最大的消息大小 (默认值: 1048576)
--shh.pow value              可接受的最小的POW (默认值: 0.2)

6.1.16        弃用选项:

--fast     开启快速同步
--light    启用轻客户端模式

6.1.17        其他选项:

help, -h    显示帮助

6.1.18        版权:

Copyright 2013-2017 The go-ethereum Authors
 

7     转账用法

eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWin(5,’win’)})

8     添加另一台机器

8.1   创建目录

mkdir ~/home/hlf/eth/data/01

8.2   使用相同的genesis.json初始化

geth --datadir /home/hlf/geth/data/01 init./genesis/genesis.json

8.3   查看第一个节点的enode

admin.nodeInfo.enode

结果为:

"enode://5572b72e701fb9f8a9c40e451ae6939e6ae2e476a79efe7a294e5efc7cfa9ba5a52d896a4ba3e8f104c63c8c91ed9f69a02e55878548913ff07b5746a7e327fb@[::]:30303"

8.4   在第二个节点执行如下:

启动第二个节点:

geth --datadir ./data/01 --networkid168  --rpc --rpcport 8546 --port 30304--rpcapi "db,eth,net,web3" console

admin.addPeer("enode://5572b72e701fb9f8a9c40e451ae6939e6ae2e476a79efe7a294e5efc7cfa9ba5a52d896a4ba3e8f104c63c8c91ed9f69a02e55878548913ff07b5746a7e327fb@192.168.2.12:30303")

也可以使用:

geth --datadir ./data/01 --networkid168  --rpc --rpcport 8546 --port 30304--rpcapi "db,eth,net,web3"  --bootnodes"enode://5572b72e701fb9f8a9c40e451ae6939e6ae2e476a79efe7a294e5efc7cfa9ba5a52d896a4ba3e8f104c63c8c91ed9f69a02e55878548913ff07b5746a7e327fb@192.168.2.12:30303"

8.5   检查

使用admin.peers查看对端

使用net.pperCount查看对端个数


猜你喜欢

转载自blog.csdn.net/haolifengwang/article/details/80494601