安装Geth
通过PPA在Ubuntu上安装
在基于Ubuntu的发行版上安装go-ethereum的最简单方法是使用内置的启动板PPA(个人软件包档案)。我们提供的是包含了我们的稳定和开发版本的Ubuntu版本的单PPA仓库trusty,xenial,zesty和artful。
要启用我们的启动板存储库,请运行:
sudo add-apt-repository -y ppa:ethereum/ethereum
然后安装稳定版的go-ethereum:
sudo apt-get update sudo apt-get install ethereum
安装golang
sudo apt-get install golang
搭建私链
创建创世区块文件genesis.json
{ "config": { "chainId": <arbitrary positive integer>, "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "istanbulBlock": 0 }, "alloc": {}, "coinbase": "0x0000000000000000000000000000000000000000", "difficulty": "0x20000", "extraData": "", "gasLimit": "0x2fefd8", "nonce": "0x0000000000000042", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp": "0x00" }
这里可以先创建新账户,会生成一个以太坊地址
# data为指定的文件夹 geth account new --datadir data
# 可以在创世区块中的 "alloc": {} 字段中预设一些地址中默认拥有多少以太币
启动私链节点
初始化节点0的创世区块
# data0 节点所在文件目录
geth --datadir data0 init genesis.json
下面命令的主体是geth console,表示启动节点并进入交互式控制台,–datadir选项指定使用data0作为数据目录;–networkid选项后面跟一个数字,这里是1997,表示指定这个私有链的网络id为1997。网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id;console 2>> ./data0/01.log 的作用是将日志写入文件中,以免在控制台中刷屏;
这两个参数不需要添加,可能会无法同步: --netrestrict 127.0.0.1/16 表示限制网络,只能与给定的IP网络(CIDR掩码)通信; --nodiscover 表示禁用对等发现机制(手动对等添加)。
geth --datadir data0 --networkid 1997 --port 30301 --netrestrict 127.0.0.1/16 --nodiscover console 2>> ./data0/01.log
运行上面的命令后,就启动了区块链节点并进入了Javascript Console:
这是一个交互式的Javascript执行环境,在这里面可以执行Javascript代码,其中>是命令提示符。在这个环境里也内置了一些用来操作以太坊的Javascript对象,可以直接使用这些对象。这些对象主要包括:
eth:包含一些跟操作区块链相关的方法 net:包含以下查看p2p网络状态的方法 admin:包含一些与管理节点相关的方法 miner:包含启动&停止挖矿的一些方法 personal:主要包含一些管理账户的方法 txpool:包含一些查看交易内存池的方法 web3:包含了以上对象,还包含一些单位换算的方法
新增其他节点
geth --datadir data1 init genesis.json
geth --datadir data1 --networkid 1997 --port 30302 --netrestrict 127.0.0.1/16 --nodiscover console 2>> ./data1/01.log
创建账户
账户默认会保存在数据目录的keystore文件夹中。
# 查看账户 eth.accounts # 创建新账户 personal.newAccount('你的密码1') # 可以创建多个账户 personal.newAccount('你的密码2')
查看账户余额(此时单位是wei)
eth.getBalance(eth.accounts[0]) eth.getBalance(eth.accounts[1])
将余额转换成以太币(ether),1个以太币=10的18次方个wei
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
启动/停止挖矿
# 括号中的参数为挖矿的线程数,可以不设置,默认全力挖矿 miner.start(10) # 第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。 # 停止挖矿 miner.stop() # 输入的字符会被挖矿刷屏信息冲掉,没有关系,只要输入完整的miner.stop()之后回车,即可停止挖矿
矿工的账户,叫做coinbase,默认情况下coinbase是本地账户中的第一个账户
# 查看账户 eth.coinbase # 修改账户 miner.setEtherbase(eth.accounts[1])
转账(账户每隔一段时间就会被锁定,需要先解锁)
# 解锁 personal.unlockAccount(eth.accounts[0]) # 这里也可以使用web3.toWei(10,'ether')代替10000000000000000000 eth.sendTransaction({from:"0x3e89eb888b8e98bfaeed304a4b71513ca1b17cac", to:"0x15c80a97e22ac48fdca0ef82c23eb2dd74ffc8d2",value:"10000000000000000000"})
此时交易已经提交但还未被处理,使用 txpool.status 命令查看交易状态,miner.start(1)开始挖矿后即可处理
# 查看交易池
txpool.status
启动挖矿,然后等待挖到一个区块之后就停止挖矿
miner.start(1);admin.sleepBlocks(1);miner.stop();
注意交易中会收取gas费
查看区块
# 查看区块数量 eth.blockNumber # 根据区块编号 eth.getBlock(48)
# 根据交易哈希查看交易 eth.getTransaction("0x31f2ce696a7de72e2d7d633c1926a7753ff36e38aba3b94e3670a7ca256405ba")
手动连接其他节点
# 参数为要连接节点的enode,在该节点使用命令admin.nodeInfo.enode
获取
admin.addPeer()