本文作者:陈进坚
博客地址:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
简书:https://www.jianshu.com/u/8ba9ac5706b6
联系方式:jian1098@qq.com
安装geth
1 | jian@ubuntu:~$ sudo add-apt-repository -y ppa:ethereum/ethereum |
查看geth版本
1 | jian@ubuntu:~$ geth version |
创世区块
新建ethereum文件夹,然后在ethereum文件夹中创建data文件夹(存储区块数据)和genesis.json文件,打开genesis.json文件将创世区块代码复制到文件中并保存
1 | jian@ubuntu:~$ mkdir ethereum |
创世区块数据
1 | { |
参数说明
参数名 | 说明 |
---|---|
nonce | nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。 |
difficulty | 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度 |
alloc | 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。 |
coinbase | 矿工的账号,任意填写一个账号即可。 |
imestamp | 设置创世块的时间戳 |
parentHash | 上一个区块的hash值,因为是创世块,所以这个值是0 |
extraData | 附加信息,随便填,可以填你的个性信息 |
gasLimit | 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。 |
mixhash | 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。. |
创建创世区块
1 | jian@ubuntu:~/ethereum$ geth --datadir data init genesis.json |
启动私有链
1 | jian@ubuntu:~/ethereum$ geth --port 3000 --networkid 15 --datadir="data" --maxpeers=3 --rpc --rpcport 8545 --rpcaddr 127.0.0.1 --rpccorsdomain "*" --rpcapi="db,eth,web3,personal,admin,txpool,net" console |
启动成功会进入js控制台
1 | Welcome to the Geth JavaScript console! |
退出私有链只需要输入exit
即可,如果要让另外一台电脑访问私有链,需要将--rpcaddr
设置为本机ip;如果是云服务器,要提供rpc
服务给其他电脑使用的话,rpcaddr
要填写云服务器的内网地址。
创建钱包
在js控制台输入命令
1 | > personal.newAccount('123456') |
得到解锁密码为123456,钱包地址为”0xee340225c3b9348847c828881a34ae3237e91456”的以太坊钱包,第一个创建的钱包地址会自动作为默认钱包,挖矿得到的ETH会存入默认钱包中,查看默认钱包:
1 | > eth.coinbase |
钱包列表
列出所有钱包
1 | > eth.accounts |
查询余额
1 | > eth.getBalance('0xee340225c3b9348847c828881a34ae3237e91456') |
或者根据钱包列表的序号
1 | > eth.getBalance(eth.accounts[0]) |
如果是默认钱包还可以这样
1 | > eth.getBalance(eth.coinbase) |
开启挖矿
挖矿会生成区块和执行交易,挖矿得到的ETH会存入默认钱包中,如果想修改默认钱包可以用以下命令
1 | > miner.setEtherbase("0xa91Ae941e92eb6Fa78FE0d8215F01cbE6b7C014c") |
开启挖矿,1表示1个线程
1 | > miner.start(1) |
第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,大概需要10分钟,等到 percentage = 100后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。看到类似下面的信息表示挖矿成功
1 | INFO [12-20|00:42:41.957] 🔗 block reached canonical chain number=2 hash=9a053e…3b1a92 |
此时新打开终端,用 geth attach 命令连接到js控制台再查询默认钱包余额,发现已经有币了
1 | jian@ubuntu:~$ cd ~/ethereum/data |
余额的单位是GWEI,要转为ETH只要除以10的18次方即可,这里的余额为175ETH
停止挖矿
1 | > miner.stop() |
区块高度
区块高度也叫区块数量、最新区块
1 | > eth.blockNumber |
解锁钱包
以太坊钱包大概每5分钟就会被锁住,交易和创建合约都需要先解锁,输入下面的命令和钱包密码即可解锁
1 | > personal.unlockAccount("0xee340225c3b9348847c828881a34ae3237e91456") |
新版本的geth
可能会报错
1 | Error: account unlock with HTTP access is forbidden |
在启动私有链的时候添加参数--allow-insecure-unlock
即可解决
发送交易
发送交易前请先解锁转出地钱包并启动挖矿,然后使用eth.sendTransaction
命令发送交易,下面的命令将从eth.accounts[0]转5个ETH到eth.accounts[1],也可以替换成具体的钱包地址:
1 | > amount = web3.toWei(5,'ether') |
发送成功将返回交易哈希,等待挖矿执行交易,再查看余额可以看到已经到账
1 | > web3.fromWei(eth.getBalance(eth.accounts[1]),'ether') |
查询交易
可以根据交易哈希查询该交易的详细信息
1 | > eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825") |
连接节点
如果局域网内有多个私有链节点,可以将这些节点连接起来组成链,这些节点会同步相同的区块和交易,相当于小型的公链。但是要将这些节点连接起来需要满足3个条件:
- 节点所在的机器,相互之间可以互联互通网络
- 有相同的创世区块
- 在启动私有链的geth命令中设置相同的networkid
假设有两个节点:节点一(ubuntu端)和节点二(windows端),它们的geth启动命令中的networkid都是1108,首先要知道节点二的enode信息,启动节点二的私有链,在js console中执行下面的命令查看enode信息:
1 | > admin.nodeInfo.enode |
复制上面给出的信息添加到admin.Peer的参数中,注意要把enode中的[::]替换成节点二的IP地址。然后在节点一的js console中执行admin.addPeer(),就可以连接到节点二了
1 | > admin.addPeer("enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d4019ac54063ed6a1d0e3c3eaedad0b73c40b99a16a176993f0373ffe92be672@192.168.1.111:30304") |
连接成功后,节点一和节点二就会开始同步的区块,保证区块数据一致。使用admin.peers
命令可以查看当前网络连接在一起的所有节点
1 | > admin.peers |
参考文章
[1] https://my.oschina.net/u/2349981/blog/856956
[2] http://blog.csdn.net/u013096666/article/details/72639906