一. 安装环境
- Ubuntu 64位 阿里云服务器
-
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
五. 账户的创建和管理
- eth.accounts 看当前节点上的所有用户
-
新建账户,输入密码,最后返回新建用户的id(公钥,账户地址)
personal.newAccount() Passphrase: Repeat passphrase: "0xc232e2add308136571bb8f9197ba4ae4e5ba9836"
- 查看账户余额 eth.getBalance(eth.accounts[0])
六. 启动和停止挖矿
-
使用miner.start() 来启动挖矿,其中start的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
miner.start(1)
-
停止挖矿 miner.stop()
-
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户. 当前挖矿收益的用户
eth.coinbase
-
要想使挖矿奖励进入其他账户,通过miner.setEtherbase()将其他账户设置成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])
- 1
-
查看区块链中交易情况,有一条pending的交易,pending表示已提交但还未被处理的交易。
txpool.status { pending: 1, queued: 0 }
- 使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:
miner.start(1);admin.sleepBlocks(1);miner.stop();
- 1
八. 查看交易和区块
- 查看当前区块总数 eth.blockNumber
-
通过交易hash查看交易
eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8f f5ec37fea6710adcab825")
- 1
-
通过区块号查看区块 eth.getBlock(33)
九. 连接到其它节点
- 查看当前节点信息 admin.nodeInfo.enode
-
可以在同一个服务器上建立另一个节点,在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")
- 1
-
通过net.peerCount可以查看已连接到的节点数量
- 如果在不同服务器上搭建节点,则需要安装geth,重新开始前面的步骤