geth 在线安装
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
将下面内容保存在一个json格式的配置文件 中,命名为genesis.json
{
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x400",
"extraData" : "0x0",
"gasLimit" : "0x2fefd8",
"nonce" : "0xdeadbeefdeadbeef",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00",
"alloc" : {} }
新建一个目录来存放区块链数据,假设新建的数据目录为~/privatechain/data0,genesis.json保存在~/privatechain中,此时目录结构应该是这样的:
privatechain
├── data0
└── genesis.json
进入privatechain中,执行初始化命令,其中–datadir选项后面跟一个目录名,这里为data0,表示指定数据存放目录为data0
$ cd privatechain
$ geth --datadir data0 init genesis.json
当看到如下输出时,则说明初始化成功
I0322 10:52:44.585282 cmd/geth/chaincmd.go:131] successfully wrote genesis block and/or chain rule set: b240e0678c2a8f87cf350225b528e3d97688aad6d4d84ee84e405c7fc9e37e4e
初始化成功后,会在数据目录data0中生成geth和keystore两个文件夹,此时目录结构如下:其中geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。
privatechain
├── data0
│ ├── geth
│ │ └── chaindata
│ │ ├── 000002.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000003
│ └── keystore
└── genesis.json
输入以下命令启动第一个节点,–datadir选项指定使用data0作为数据目录,–networkid选项后面跟一个数字,这里是314590,表示指定这个私有链的网络id。在多个节点私有网络中,id应该相同。
geth --datadir data0 --networkid 314590 --ipcdisable --port 61910 --rpcport 8200 console
ps:用以上命令启动,因为geth版本原因,在后面挖矿时,会输出null,因此可以在启动命令后加–dev –dev.period 1。一般不需要,可以先检查一下当前系统中是否已经有用户。
当看到以下信息时,区块链节点运行成功
Welcome to the Geth JavaScript console!
instance: Geth/v1.5.6-stable/linux/go1.7.3
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal: 1.0 rpc:1.0 txpool:1.0 web3:1.0
新建账户,输入密码,最后返回新建用户的id(公钥,账户地址)
personal.newAccount()
Passphrase:
Repeat passphrase:
"0xc232e2add308136571bb8f9197ba4ae4e5ba9836"
使用miner.start() 来启动挖矿,其中start的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
miner.start(1)
停止挖矿 miner.stop()
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户. 当前挖矿收益的用户
eth.coinbase
miner.setEtherbase(eth.accounts[1])
创建交易
amount = web3.toWei(5,'ether')
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
账户解锁操作,账户每隔一段时间就会被锁住,要发送交易,必须先解锁账户,然后重新发送交易
personal.unlockAccount(eth.accounts[0])
查看区块链中交易情况,有一条pending的交易,pending表示已提交但还未被处理的交易。
txpool.status
{ pending: 1, queued: 0 }
使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:
miner.start(1);admin.sleepBlocks(1);miner.stop();
通过交易hash查看交易
eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8f f5ec37fea6710adcab825")
通过区块号查看区块 eth.getBlock(33)
可以在同一个服务器上建立另一个节点,在privatechain下,建立文件夹data1,然后输入初始化和启动命令.–bootndoes 是设置当前节点启动后,直接通过设置–bootndoes 的值来链接第一个节点, –bootnoedes 的值可以通过在第一个节的命令行中,输入:admin.nodeInfo.enode命令打印出来.
geth --datadir data01 init ./genesis.json
geth --datadir data01 --networkid 314590 --ipcdisable --port 61911 --rpcport 8101 --bootnodes "enode://ad307e052d0e04af519b8999fa870800df8a7a0cc2a91e6aea30e879b75c344dfa12c773a63a71677c2a3ea1254cf982815817f7ff58bd79e5837ea44d791a2d@192.168.1.2:61910" console
另一种添加节点的方法 在节点一上admin.addPeer(),就可以连接到节点二
admin.addPeer("enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d4019ac54063ed6a1d0e3c3eaedad0b73c40b99a16a176993f0373ffe92be672@127.0.0.1:61910")
通过net.peerCount可以查看已连接到的节点数量