以太坊智能合约从入门到实战2(私链与挖矿)
什么是私链
大家都知道,我们平时的转账交易,都是在主网进行的。主网就是由所有节点和矿工共同维护,唯一认定的区块链网络。
而私链,则是完全独立于主网以外的网络。和主网最大的不同是,私链一般没有其他人参与,你就是私链里唯一的用户和矿工,你可以随意设置参数,让挖矿变得很简单,从而轻松拥有大量的“以太币”,当然你也无法拿到主网上去交易。
私链相当于测试网络,进行各种操作以及获取以太币都是不需要成本的,给开发提供了必要的练习和测试场所。要知道,最后在主网上部署智能合约,可是需要消耗真正的以太币的。
了解完什么是私链,下面我们开始基于以太坊搭建自己的私链。
运行以太坊私链
1. 新建一个目录用于存放私链数据
如笔者新建的目录:E:\Ether\private
2. 配置初始化创世文件
在上面的目录下新建一个文本文件,命名为“genesis.json”,把下面的内容粘贴进去。
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x40000",
"extraData" : "",
"gasLimit" : "0xffffffff",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00",
"alloc": { }
}
3 初始化网络
geth --datadir "E:\Ether\private" init "E:\Ether\private\genesis.json"
打开CMD界面,输入以上命令,回车。
如果目录下生成了“geth”和"keystore"两个文件夹,说明数据初始化成功
4 运行网络
geth --datadir "E:\Ether\private" --networkid 15 --port 61910 --rpc --rpcport 8545 --rpcapi "db,eth,net,web3" console
输入以上命令,回车。
到这一步,说明以太坊私链已经成功运行!
5. 参数说明
参数 | 说明 |
---|---|
datadir | 指定数据存储的目录 |
networkid | 网络ID,比如主网的ID为1,搭建多节点时要用到 |
port | 网络端口号 |
rpc | 开启远程过程调用,即可以通过API方式与私链交互 |
rpcport | rpc的端口号 |
rpcapi | 要启用的远程调用API |
console | 打开控制台,这样我们才能通过命令行调用rpcapi |
账户、挖矿和交易
上面我们已经成功运行起自己的私链网络,下面开始学习一些常用的操作。
注意,下面的命令都是要在控制台模式下进行的。
创建账户
personal.newAccount("123456")
创建账户需要传入密码(如果是主网,密码千万不能丢失)。创建成功后,返回该账户的地址,而地址对应的私钥是加密保存的,保存在keystore对应目录下。
查看账户列表
eth.accounts
可以创建多个账户,通过上面的命令可以查看客户端下存在的账户列表。
查看账户余额
eth.getBalance(eth.accounts[1])
上面表示查看账户列表中第二个账户的以太币余额(数组下标从0开始)。
为挖矿设置Coinbase地址
miner.setEtherbase(eth.accounts[1])
coinbase地址可以理解为,挖矿成功后,奖励的以太币要转入到哪个地址,不设置默认为第一个账户的地址。
查看当前设定的Coinbase地址
eth.coinbase
开始挖矿
miner.start()
第一次启动会比较慢,启动成功后,几乎都秒都能挖出一个区块,因为我们在genesis.josn中把难度(difficulty)设得很低。
停止挖矿
miner.stop()
停止挖矿后,再次查看账余余额,会发现已经有以太币在其中。
- 注意,里面显示的以太币余额,是以wei为单位,1 ether=1000000000000000000 wei(18个0)。
查看区块高度
eth.blockNumber
解锁账户
personal.unlockAccount(eth.accounts[1],"123456")
如果想要使用账户里面的资金,需要先解锁账户。
转账
web3.eth.sendTransaction({from:eth.accounts[1],to:eth.accounts[0],value:web3.toWei(3,"ether")})
转账要传三个参数,发送者,接收者,转账数量。
上面是从第二个账户转到第一个账户,但是转账完马上查看第一个账户的余额发现是0,因为交易还未打包进区块。
查看未打包的交易
txpool.status
刚转账完,会发现的确有一笔未打包的交易,那要怎么打包呢?当然是通过挖矿。
再次启动挖矿,挖出区块后停止挖矿,再次使用上面的命令查看,发现已经没有未打包的交易。再次查询第一个账户的余额,发现已经有以太币在其中,交易完成。
最后附上操作的截图,大家也可以多练习一下。
通过控制台连接正在运行的节点
启动节点时,在命令语句最后加上“console”代表同时开启控制台。但由于控制台会不停打印消息,比如挖矿时,屏幕会不停地快速刷新,导致其它操作不好进行。
这里向大家提供一个小技巧。
还是按上面的方式启动节点网络,但语句最后不要加“console”
geth --datadir "E:\Ether\private" --networkid 15 --port 61910 --rpc --rpcport 8545 --rpcapi "db,eth,net,web3"
进入数据存储目录,即"geth"和“keystore”文件夹所在的目录,按住shift键,鼠标右击,选择“在此处打开命令窗口”
geth attach ipc:\\.\pipe\geth.ipc
在命令窗口输入以上命令,即可连接到刚才启动的节点网络,此时两个命令窗口是互不干扰的。