Geth搭建私有链

1.安装geth客户端 https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum

2.安装完成后检查
利用命令 geth version,检查是否安装成功


3.建立目录和genesis.json

创世块文件

区块链上第一个区块叫做创世块,创建我们私链的时候可通过创世块配置文件来声明和定义。把以下文件内容存储为genesis.json文件

mkdir tmpPrivate
cd tmpPrivate/
vim genesis.json
(如果没有vim命令,可以安装,如图)


vim genesis.json

mixhash

与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。.

nonce

nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。

difficulty

设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度

alloc

用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。

coinbase

矿工的账号,随便填

timestamp

设置创世块的时间戳

parentHash

上一个区块的hash值,因为是创世块,所以这个值是0

extraData

附加信息,随便填,可以填你的个性信息

gasLimit

该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

常遇到的几个错误:

  • Fatal: invalid genesis file: missing 0x prefix for hex data:这个错误信息意思很明白,就是你的json文件中,对于16进制数据,需要加上0x前缀

  • Fatal: invalid genesis file: hex string has odd length: 从v1.6开始,设置的十六进制数值,不能是奇数位, 比如不能是0x0,而应该是0x00。

  • Fatal: failed to write genesis block: genesis has no chain configuration :这个错误信息,就是说,你的json文件中,缺少config部分。看到这个信息,我们不需要把geth退回到v1.5版本,而是需要加上config部分。

  • Error: invalid sender undefined: 这个错误不会导致初始化失败,但是会在以后的转账(eth.sendTransaction),或者部署智能合约的时候产生。解决方法就是chainId 不能设置为0。 如果你完全按照github上给的官方配置文件,就会产生这个错误。


4.执行命令,创建创世区块
geth -datadir dataName init genesis.json

注意:
这时候可以注意一下,此时当前目录下面会新增出一个dataName文件,dataName下面有两个文件夹geth和keystore
geth中保存的是区块链的相关数据
keystore中保存的是该链条中的用户信息


5.启动,创建自己的私有链条

第一种方式    geth --datadir "./" --nodiscover console 2>>geth.log

注意:

–datadir 代表文件夹地址,

--nodiscover 表示私有链不要让公网上的节点发现
其中的代码 console 2>> geth.log 代表将控制台的一部分输出,输出到文件geth.log上去。

打开另一个终端,找到geth.log的所在目录,执行命令 tail -f geth.log 从而持续的输出以太坊的日志



第二种方式    打开命令行,定位到保存私链的文件地址路径,

如需通过初始化文件配置账户的默认以太币数量,可先在控制台新增用户,并将账户地址替换到genesis.json的alloc中
dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6,然后重新执行 geth --datadir "./" init genesis.json ,
另外一种方式就是新增账户后,执行挖矿  miner.start()  开始挖矿,miner.stop() 停止挖矿,期间挖的以太币会自动存储到
第一个账户中。

指定地址和端口号的启动方法

geth --identity "newETH" --rpc --rpccorsdomain "*" --datadir  dataName --rpcaddr 127.0.0.1 --rpcport 8080  --port 30303 --nodiscover --rpcapi "db,eth,net,web3,admin,personal" --networkid 999  console


参数解释:

--nodiscover 使用这个参数,你的节点就不会被其他人发现,除非手动添加你的节点。否则,就只有一个被无意添加到一个陌生区块链上的机会,那就是跟你有相同的genesis文件和networkID。

--maxpeers 0 如果你不想有人连上你的测试链,就用maxpeers 0。或者,你可以调整参数,当你确切的知道有几个节点要连接上来的时候。

--rpc 允许RPC操作你的节点。这个参数在Geth上是默认的。

--rpcapi "db,eth,net,web3" 这个命令指示了允许通过RPC访问的命令。默认情况下,Geth允许web3。

--rpcport "8080"

--rpccorsdomain "http://chriseth.github.io/browser-solidity/"--datadir "/home/TestChain1" 私有链存放路径(最好跟公有链路径不同)

--port "30303" 网络监听端口,用来和其他节点手动连接

--identity “TestnetMainNode" 用来标识你的节点的,方便在一大群节点中识别出自己的节点


注意:

–datadir 代表文件夹地址,


6.在自己的私有链上创建用户
输入命令eth.accounts, 我们会发现返回值为[]
这是因为此时虽然以太坊的私有链已经被创造出来,但还没有任何账户。


输入命令personal.newAccount("xxx"), 该命令将创造一个新的用户,该用户的密码是xxx. 当然用户也可以将xxx 改为123,或者123456,或者任意密码
再次输入命令 eth.accounts, 我们会发现一个新的用户被创建了出来,这就代表我们已经创建了一个账户,重复personal.newAccount() & eth.accounts 我们可以创建若干个账户出来

7.挖矿

在命令行中执行命令 miner.start(), 开始在我们的区块链上进行挖矿



注意:


1. 挖矿挖到的ether币会默认保在第一个账户中,即eth.acccounts[0]中。


2. 挖矿是执行智能合约的基础。如果停止挖矿的话,不仅以太币会停止生成,所有智能合约的调用也会不起作用。


3. 如果真的要停止挖矿,可以执行命令miner.stop()来停止挖矿


4. 按上面的命令,应该是可以实现以太坊挖矿的。如果不行的话,有可能就是之前有存在的链,此时应该删除之前的数据。在Mac下即删除~/.ethash文件夹和里面的文件即可


5挖矿启动后,查看主账户的以太币数量

acc0 = eth.accounts[0]
eth.getBalance(acc0)


8.交易

每个账户的公钥(地址)是一切以太坊账户操作的核心,但地址字符串太长,我们用acc0/acc1 分别代表accounts[0]和[1],另外设置要转移0.01个以太币。

使用eth.sendTransaction来将0.01个以太币从acc0转移到acc1中。

acc0 = eth.accounts[0]

acc1 = eth.accounts[1]

amount = web3.toWei(0.01)

eth.sendTransaction({from: acc0, to: acc1, value: amount})

截图:


注意:

1.之所以交易时报错,是因为

这个是以太坊的一个保护机制,每隔一段时间账户就会自动锁定,这个时候任何以太币在账户之间的转换都会被拒绝,除非把该账户解锁.

这个时候我们就需要执行 personal.unlockAccount(acc0) 并输入密码来解锁acc0才可。(如上图)

2.输入完交易的命令,我立即就查看acc1余额,发现是0!!!

这是因为交易提交未被处理,我们可以通过这可以通过查看txpool.status来验证,如果我们看到pending:1,pending表示已提交但还未被处理的交易;

要使交易被处理,必须要挖矿。(如上图,我开启了挖矿)

这个成功转账的截图(但第一次查看仍然是0):


9.查看节点信息

admin.nodeInfo //查看当前节点信息

> admin.nodeInfo{ enode: "enode://160e220dda023b7307de009791be621a2857195f062a6a1d9002276e95604f07481fca352a31bb6e1219edb5760ccdec65cad37310be578c2ad503ccd301a762@[::]:30303", id: "160e220dda023b7307de009791be621a2857195f062a6a1d9002276e95604f07481fca352a31bb6e1219edb5760ccdec65cad37310be578c2ad503ccd301a762", ip: "::", listenAddr: "[::]:30303", name: "Geth/v1.6.5-stable-cf87713d/darwin-amd64/go1.8.3", ports: { discovery: 30303, listener: 30303 }, protocols: { eth: { difficulty: 17179869184, genesis: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", head: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", network: 1 } }}


10.配置第二台私链服务器

要求: 两台电脑网络相通,并且要指定相同的networkid

按照同样的步骤在B电脑上搭建私链。

搭建完成后在B电脑上输入:

admin.addPeer("节点信息@A电脑ip地址:30303");例如: admin.addPeer("enode://160e220dda023b7307de009791be621a2857195f062a6a1d9002276e95604f07481fca352a31bb6e1219edb5760ccdec65cad37310be578c2ad503ccd301a762@127.0.0.1:30303")

验证是否和其他节点成功建立连接,输入admin,查看是否连接上了节点,很多时候回连接不上,这时候就可以从另外一个节点尝试添加本节点,这样就会成功了。




原文链接:http://m.blog.csdn.net/Vinsuan1993/article/details/75208203

你可能感兴趣的:(区块链)