以太坊私链搭建步骤:
- 创建创世区块初始化文件(路劲:C:\Program Files\Geth\创建创世块的初始化文件genesis.json)
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x02000000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
- [ ] 注释:
- difficulty”: “0x40000”,//难度,该值越大,出块越慢.
- “extraData”: “Genesis Block”,//附加信息,随意填写.
- “gasLimit”: “0xffffffff”//每个块所能容载的gas上线,可以暂时理解为
- [] 说明:
配置自己的创世块是为了区分公有链,同一个网络中,创世块必须是一样的,否则无法联通
- 在Geth安装目录下放置创世区块文件并初始化
geth --datadir "%cd%\chain" init genesis.json
//%cd%:代表Geth安装目录
geth -datadir "%cd%\chain" console
以太坊两台机器组网
geth --datadir "./" init genesis.json //初始化创世区块
geth --datadir "./" --nodiscover --networkid 333 --ipcdisable --port 1111 --rpc --rpyitaicport 2222 console //启动Geth控制台开发工具
admin.nodeInfo.enode //获取本节点信息
(我的返回值:
"enode://c4561d49c91090f4666969dd01b223adbe10c9eeb3d65326002099e4a9f3f17dec3d3c70c8dceffbe4438d3f5f0ee5a9a11841076063422b629be778d669c8df@[::]:1111")
)
geth --datadir "./" init genesis.json //初始化创世区块
geth --datadir "./" --nodiscover --networkid 333 --ipcdisable --port 3333 --rpc --rpcport 4444 console //启动Geth控制台开发工具(注意端口不同)
然后B节点加入A节点:(通过A的enode信息来连接,其中包括了ip地址和端口号)
admin.addPeer("enode://c4561d49c91090f4666969dd01b223adbe10c9eeb3d65326002099e4a9f3f17dec3d3c70c8dceffbe4438d3f5f0ee5a9a11841076063422b629be778d669c8df@192.168.1.1(~~A节点Ip~~):1111") (注意修改A节点IP)
net.peerCount (返回已经连接的其他节点的个数)
admin.peers (返回其他节点的信息)
- [ ] 然后在一个节点创建账户,开始挖矿,另一个节点也会自动同步
A节点可以将智能合约部署在私有链上,B节点可以根据合约部署地址来调用
- 创建账户,返回账户地址
personal.newAccount()
输入密码:*******
- 查询存在的账户
eth.accounts
- 查询对应的账号
eth.accounts[0]
- 查询当前账户余额
eth.getBalance(eth.accounts[0])
- 交易
#### 需要先解锁账户,以太坊的一个保护机制,每隔一段时间账户就会自动锁定,这个时候任何以太币在账户之间的转换都会被拒绝,除非把该账户解锁
1. 解锁账户:
personal.unlockAccount(eth.accounts[0])
2. 格式化币数量
Amount = web3.toWei(5,’ether’)
3. 发起交易,返回交易hash值
eth.sendTransaction({from:发起交易账户地址,to:接收账户地址,value:货币数量})
4. 通过hash值查看交易
eth.getTransaction(交易hash值)
5. 开始挖矿--停止挖矿
miner.start()----miner.stop() - 注意:挖矿页面可以不用管日志刷屏,确保输入完整命令然后回车就行,命令能够正常执行
- 查看当前链上的未完成交易状态
txpool.status
- 查看当前区块数量
eth.blockNumber
- 通过区块号查看区块信息
eth.getBlock(0) //查看创世区块信息
#### 开启挖矿默认会使用eth.accounts[0]账户,如果要切换挖矿账户,可以使用命令:
miner.setEtherbase(eth.accounts[1])
在私有链上部署智能合约
- 解锁账户,编写智能合约
var a_demotypesContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"f","outputs":[{"name":"b","type":"uint256"}],"payable":false,"type":"function"}]);
var a_demotyjipes = a_demotypesContract.new(
{
from: web3.eth.accounts[0],
data: '0x6060604052341561000c57fe5b5b60ab8061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063b3de648b14603a575bfe5b3415604157fe5b60556004808035906020019091905050606b565b6040518082815260200191505060405180910390f35b600060006008830290508091505b509190505600a165627a7a7230582010decdc0b0a43b565814fe904eae2544665457d6353c7d906fc2c43c81c867e40029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
- 在Geth命令行输入智能合约并执行
其他注意事项
- window以太坊钱包连接私有网络
- Ethereum-Wallet.exe 有可能会超时失败,我们指定本机rpc
C:\Program Files\Ethereum-Wallet\Ethereum Wallet.exe --rpc "\\.\pipe\geth.ipc" (我装到了c盘,用管理员权限)
- 启动命令包含字段说明
--dev 表示自动创建一个账户并直接开始挖矿,--dev.period 1表示不用等有交易了才挖,如果设成0的话没有交易挖矿就是null
- 命令详解:
geth –targetgaslimit 4294967295 –rpc –rpcaddr “192.168.1.5” –rpcport “8101” –port “30301” –rpcapi “eth,web3,personal” –networkid 20180401 –identity 20180401 -nodiscover -maxpeers 5 –datadir “chain” -unlock 0 -rpccorsdomain “*” –mine console 2>geth.log
******************************************************************************
targetgaslimit –每个块的gas上限,这里可以暂时理解为容量
rpc –启动rpc通信,可以进行智能合约的部署和调试
rpcaddr –rpc接口的地址
rpcport –rpc接口的端口号
port –网络监听端口,用于节点之间通信
rpcapi –设置rpc的范围,暂时开启eth,web3,personal足够
networkid –设置当前区块链的网络ID,是一个数字,可以随便写
identity –区块链的标示,随便填写,用于标示目前网络的名字
nodiscover 禁止被网络中其它节点发现,需要手动添加该节点到网络
maxpeers 最大节点数量 datadir –设置当前区块链网络数据存放的位置
unlock –解锁某用户(此处用用户坐标来控制,解锁后的用户调用接口发起交易时,不要需要提供密码)
rpccorsdomain 限制rpc访问源的ip,代表不限制
mine 允许挖矿
console –启动命令行模式,可以在Geth中执行命令
- Geth的Javascript console执行环境,其内置了以下Javascript对象:
eth:包含一些跟操作区块链相关的方法
net:包含以下查看p2p网络状态的方法
admin:包含一些与管理节点相关的方法
miner:包含启动&停止挖矿的一些方法
personal:主要包含一些管理账户的方法
txpool:包含一些查看交易内存池的方法
web3:包含了以上对象,还包含一些单位换算的方法
你的赞赏,是我的动力