目录
一.geth的安装
1. https://geth.ethereum.org/downloads/ //此链接为geth的各个版本,根据需求下载使用,本文所用为1.7.3版本。链接打不开的可以私信我给你安装包。
2. 安装目录。下载完成后安装除c盘的文件中,我安装在了d盘。如下图:
。
3。安装完以后我们需要在这个文件中创建一个genesis.json的文件。代码如下:
{ "nonce": "0x0000000000000042", "difficulty": "0x4", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0xffffffffffffff", "alloc": {}, "config": { "chainId": 666, "homesteadBlock": 0, "eip150Block": 0, "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "istanbulBlock": 0, "ethash": {} } }
4.创建完成后,目录中就是两个文件。
二.geth的启动(先同步两个节点)
1. win+R打开第一个控制台输入以下命令。
![]()
2.接着就是初始化,此处data是生成一个存储数据的文档,可以更改名字。(初始化创世块的命令)
geth --datadir ./data-init1/ init genesis.json
3.启动并进入控制台。
geth --datadir ./data-init1/ --port 30303 --nodiscover console
4.显示如下界面,启动成功。(Welcome to the Geth JavaScript console!)
5.win+R打开第二个控制台输入以下命令。 (初始化创世块的命令)
geth --datadir ./data-init2/ init genesis.json
6.启动并且进入控制台。(注意此处多一个ipcdiable参数,如与第一个控制台一样,会报错:Erro starting protocol stack:Access is denied)
geth --datadir ./data-init2/ --port 40404 --nodiscover --ipcdisable console
7.分别在两个控制台创建新的账号,并记录地址。
personal.newAccount("123456")
8.两个账号的地址分别为:
"0x0d12fd40b27405558103da6f6938ebc2eb8c257d" "0xd133cddb87fef456314da378f78dda0a20022f96"
三.联盟链互通
1.查看节点的peers的情况。
> admin.peers []
2.通过分享enode地址的方式来让两个节点建立链接。(打开控制台2输入)
admin.nodeInfo.enode
3.显示如下界面。
通过上面命令,我们获得了节点2的encode信息。这是geth用来连接到不同节点的enode信息,在这些不同的节点它们能够分享交易和成功挖掘信息。
4.复制节点2的enode的信息,在节点1的控制台执行以下命令。 (把2的节点链接到1中,返回true说明成功)
admin.addPeer ("enode://0bd1b7da689dd574eae04d20484086a5c59d81981b927602ef745233a72eac3280ea1a193a41c24d05fae54ae9e78d4fd76b590ffc356c6786eb6f70b0e6b276@[::]:40404?discport=0")
5.在控制台1执行挖矿miner.start()时,我们会发现节点2的控制台出现了这样的日志信息,说明同步成功,也就是说,节点1挖矿,节点2在同步数据信息。
6.停止节点1的挖矿,并我们拿节点1的这个地址在节点2的控制台查询一下信息,查看coinbase地址金额。
> eth.getBalance("0x0d12fd40b27405558103da6f6938ebc2eb8c257d") 1.334999999999844444446e+21
以上信息说明,节点1和节点2的数据是完全同步的。
四.节点3的接入以及转账同步。 (操作流程类似)
1.win+R打开第三个控制台输入以下命令。 (初始化创世块的命令)
geth --datadir ./data-init3/ init genesis.json
2. 启动并进入控制台。
geth --datadir ./data-init3/ --port 50505 --nodiscover --ipcdisable console WARN [10-28|10:35:53] No etherbase set and no accounts found as default INFO [10-28|10:35:53] Starting peer-to-peer node instance=Geth/v1.7.3-stable-4bb3c89d/windows-amd64/go1.9 INFO [10-28|10:35:53] Allocated cache and file handles database=D:\\testGeth\\data-init3\\geth\\chaindata cache=128 handles=1024 WARN [10-28|10:35:54] Upgrading database to use lookup entries INFO [10-28|10:35:54] Database deduplication successful deduped=0 INFO [10-28|10:35:54] Initialised chain configuration config="{ChainID: 72 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Engine: unknown}" INFO [10-28|10:35:54] Disk storage enabled for ethash caches dir=D:\\testGeth\\data-init3\\geth\\ethash count=3 INFO [10-28|10:35:54] Disk storage enabled for ethash DAGs dir=C:\\Users\\Administrator.DESKTOP-BT0S13O\\AppData\\Ethash count=2 INFO [10-28|10:35:54] Initialising Ethereum protocol versions="[63 62]" network=1 INFO [10-28|10:35:54] Loaded most recent local header number=0 hash=942f59…a2588a td=16384 INFO [10-28|10:35:54] Loaded most recent local full block number=0 hash=942f59…a2588a td=16384 INFO [10-28|10:35:54] Loaded most recent local fast block number=0 hash=942f59…a2588a td=16384 INFO [10-28|10:35:54] Regenerated local transaction journal transactions=0 accounts=0 INFO [10-28|10:35:54] Starting P2P networking INFO [10-28|10:35:54] RLPx listener up self="enode://6746169e29e872fa71e856e9535fc31aef2a63dce1fe7e71b2b9fea4ca42ea75f3ad740eec6471518505337d425da7148ba442596405d8e6efa3faa9100bb7f5@[::]:50505?discport=0" Welcome to the Geth JavaScript console! instance: Geth/v1.7.3-stable-4bb3c89d/windows-amd64/go1.9 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
3.创建新账号。
personal.newAccount("123456")
4. 通过分享enode地址的方式来让两个节点建立链接。(打开控制台3输入)
> admin.nodeInfo.enode "enode://6746169e29e872fa71e856e9535fc31aef2a63dce1fe7e71b2b9fea4ca42ea75f3ad740eec6471518505337d425da7148ba442596405d8e6efa3faa9100bb7f5@[::]:50505?discport=0"
5.复制节点3的enode的信息,在节点2的控制台执行以下命令。 (把3的节点链接到2中,返回true说明成功)
> admin.addPeer("enode://6746169e29e872fa71e856e9535fc31aef2a63dce1fe7e71b2b9fea4ca42ea75f3ad740eec6471518505337d425da7148ba442596405d8e6efa3faa9100bb7f5@[::]:50505?discport=0") true
6.进行转账交易。(转账之前先解锁,在控制台1操作)
personal.unlockAccount("0x0d12fd40b27405558103da6f6938ebc2eb8c257d") Unlock account 0x0d12fd40b27405558103da6f6938ebc2eb8c257d Passphrase: true
7.给节点2以及节点3转账。
> eth.sendTransaction({from: eth.coinbase, to: '0xd133cddb87fef456314da378f78dda0a20022f96', value: 66666666}) INFO [10-28|10:33:11] Submitted transaction fullhash=0x7ab1130510f6bce2e82f92635eedc5f5d6637e032233b15d6f9a02c3a478b29b recipient=0xd133cDdb87FEf456314da378F78Dda0A20022F96 "0x7ab1130510f6bce2e82f92635eedc5f5d6637e032233b15d6f9a02c3a478b29b" > eth.sendTransaction({from: eth.coinbase, to: '0xd133cddb87fef456314da378f78dda0a20022f96', value: 66666666}) INFO [10-28|10:33:11] Submitted transaction fullhash=0x7ab1130510f6bce2e82f92635eedc5f5d6637e032233b15d6f9a02c3a478b29b recipient=0xd133cDdb87FEf456314da378F78Dda0A20022F96 "0x7ab1130510f6bce2e82f92635eedc5f5d6637e032233b15d6f9a02c3a478b29b"
8.查询节点2,3余额发现为0,因为虽然我们发起了交易,单并没有矿工挖矿打包交易。再次执行miner.start()。再次查询,就会发现节点2,3的coinbase地址已经有金额了。
> eth.getBalance("0x47792beb63a58a82ca3fde1039ab0f4fedac2722") 88888888 > eth.getBalance("0xd133cddb87fef456314da378f78dda0a20022f96") 66666666 >
通过以上的操作我们已经建立了一个拥有三个节点的联盟链,如果想建立更多节点的联盟链,可以此添加新的节点。