搭建以太坊联盟链教程windows平台

1、下载Geth.exe 运行文件,并安装
https://github.com/ethereum/go-ethereum/releases/
访问不了可以访问国内镜像地址下载

下载geth-windows-amd64-1.8.2后安装
2、cmd进入安装目录运行:geth -help看看是否可用geth命令
3、在Geth安装目录下放置初始化创世块文件genesis.json
{
  "nonce":"0x0000000000000042",
  "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "difficulty": "0x4000",
  "alloc": {},
  "coinbase":"0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x00000000",
  "gasLimit":"0xffffffff",
  "config": {
    "chainId": 666,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  }
}
注意红色部分:
不然会出现错误“Fatal: invalid genesis file: json: cannot unmarshal hex string without 0x prefix into Go struct field Genesis.extraData of type hexutil.Bytes

解释:

4、cmd进入geth安装目录,初始化创世块 cmd输入geth --datadir "%cd%\chain" init genesis.json
%cd%:代表Geth安装目录
5、创建私有链 打开geth控制台  geth -datadir "%cd%\chain"  --nodiscover console 2
6、在私有链上创建账号,键入:personal.newAccount()
会提示输入密码,我输入:123456
7、挖矿
开始挖矿miner.start()
结束挖矿miner.stop()
8、命令查看主账户中以太币的数量
eth.getBalance(eth.accounts[0]) 结果不为0,说明挖矿成功
9、图形化钱包查看账户以太币数量
下载打开图形化钱包https://github.com/ethereum/mist/releases/
访问不了可以访问国内镜像地址下载 
当前下载版本为Windows 系统:Ethereum-Wallet-installer-0-9-3.exe
安装之后运行这个钱包,运行Ethereum-Wallet.exe,即启动成功,如果区块链正常的话,会在右上角显示“PRIVATE-NET”,点击“LAUNCH APPLICATION”进入图形界面即可查看,如下图:

--------------------- 
作者:dns007 
来源:CSDN 
原文:https://blog.csdn.net/lipei1220/article/details/79475283 
版权声明:本文为博主原创文章,转载请附上博文链接!

--------------------------------------------------------------------------分隔符-------------------------------------------------------------------------------------

两个节点的联盟连搭建

我们将使用geth,在Windows下搭建两个节点的基础联盟链。

一、创世区块

首先创建两个文件夹a和b,分别写入创世区块文件,比如:genesis.json,文件内容如下:

{
    "config": {
        "chainId": 15,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "coinbase": "0x0000000000000000000000000000000000000000",
    "difficulty": "0x40000",
    "extraData": "",
    "gasLimit": "0xffffffff",
    "nonce": "0x0000000000000042",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "alloc": {}
}

在命令行输入如下命令,进行初始化的操作。

D:\Ether\a>geth --datadir ./data-init1/ init genesis.json
D:\Ether\b>geth --datadir ./data-init1/ init genesis.json
  • --datadir :指定节点数据存储目录。
  • init:初始化命令

命令执行完成后,会在 data-init1 文件夹下生成两个目录,一个为 geth,一个为 keystore

  • geth:存放数据相关的信息
  • keystore:存放加密过的私钥文件

执行完打印的log如下:

INFO [09-13|11:02:01] Maximum peer count                       ETH=25 LES=0 tota
l=25
INFO [09-13|11:02:01] Allocated cache and file handles         database=D:\\Ethe
r\\b\\data-init1\\geth\\chaindata cache=16 handles=16
INFO [09-13|11:02:01] Writing custom genesis block
INFO [09-13|11:02:01] Persisted trie from memory database      nodes=0 size=0.00
B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [09-13|11:02:01] Successfully wrote genesis state         database=chaindat
a                                 hash=a0e580…a5e82e
INFO [09-13|11:02:01] Allocated cache and file handles         database=D:\\Ethe
r\\b\\data-init1\\geth\\lightchaindata cache=16 handles=16
INFO [09-13|11:02:01] Writing custom genesis block
INFO [09-13|11:02:01] Persisted trie from memory database      nodes=0 size=0.00
B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [09-13|11:02:01] Successfully wrote genesis state         database=lightcha
indata                                 hash=a0e580…a5e82e

二、启动控制台

开启两个窗口来启动两个节点,在第一窗口执行以下命令启动一个节点,启动之后注意不要关闭窗口。

D:\Ether\a>geth --datadir ./data-init1/ --networkid 88 --nodiscover console
  • networkid 指定网路ID,确保不使用1-4,1-4系统内置使用,这里写88。
  • nodiscover 此参数确保geth不去寻找peers节点,主要是为了控制联盟链接入的节点。

启动第一个节点时未指定port参数,此处采用默认的port,也就是 30303
如果打印的日志中显示 “Welcome to the Geth JavaScript console!” 则说明启动成功了。

下面在另外一个窗口,换一个端口,比如 30305 ,来启动第二个节点。

D:\Ether\b>geth --datadir ./data-init1/ --port 30305 --networkid 88 --nodiscover --ipcdisable  console

注意:在windows中,启动第二个节点会报错:Fatal: Error starting protocol stack: Access is denied.,解决方法是添加参数:--ipcdisable

这样,我们就顺利的启动了两个节点,进入了控制台,接下来的操作都在控制台中进行。

三、添加coinbase账户

现在我们在第一个节点上创建一个账户,具体如下:

> personal.listAccounts
[]
> personal.newAccount("123456")
"0xed0dfd1c42c18fbf71df07135950d25353a9786c"

上面的命令先是查看了节点下的地址,结果为空,然后创建了一个密码为 123456 的账号。同样我们在另外一个窗口执行同样的命令:

> personal.listAccounts
[]
> personal.newAccount("123456")
"0x18e95f783866f4404530e13b7e868169db300fdf"

两个节点就拥有了两个地址。同时,在它们的keystore目录下面生成了加密的私钥文件。

执行以下命令查看coinbase账号:

> eth.coinbase
INFO [09-13|11:44:39] Etherbase automatically configured       address=0xeD0DFd1c42C18FBF71DF07135950D25353A9786C
"0xed0dfd1c42c18fbf71df07135950d25353a9786c"

由于只有一个地址,因此该地址就作为了coinbase地址。如果想查看更多信息可以执行以下命令:

> personal.listWallets
[{
    accounts: [{
        address: "0xed0dfd1c42c18fbf71df07135950d25353a9786c",
        url: "keystore://D:\\Ether\\a\\data-init1\\keystore\\UTC--2018-09-13T03-44-33.438000200Z--ed0dfd1c42c18fbf71df07135950d25353a9786c"
    }],
    status: "Locked",
    url: "keystore://D:\\Ether\\a\\data-init1\\keystore\\UTC--2018-09-13T03-44-33.438000200Z--ed0dfd1c42c18fbf71df07135950d25353a9786c"
}]

这里不仅打印了账户信息,还打印出了私钥的存储位置和账户的状态等信息。

四、联盟链互通

上面分别是在两个节点上进行的操作,下面需要把两个节点之间建立连接。首先,执行以下命令查看节点的peers的情况。

> admin.peers
[]

发现节点并没有链接上任何其他节点,这是 nodiscover 参数发挥了作用。下面通过分享encode地址的方式来让两个节点建立链接。

> admin.nodeInfo.enode
"enode://0c11cb0e593b0204f65d183cccf33960a37b5a9cc2d30a7d2e186af170686997eb905853ad970af6d7
9ac47577aec21487f9f3138975851a489871a391d73a65@[::]:30305?discport=0"

通过在窗口2中输入 admin.nodeInfo.enode命令,可以获得节点2的enode信息。现在我们要告知节点1,节点2的enode信息,首先负责节点2 enode信息,在节点1的控制台输入如下命令:

> admin.addPeer("enode://0c11cb0e593b0204f65d183cccf33960a37b5a9cc2d30a7d2e186af170686997eb905
853ad970af6d79ac47577aec21487f9f3138975851a489871a391d73a65@[::]:30305?discport=0")

true

返回true,说明执行成功。我们验证一下:

> admin.peers
[{
    caps: ["eth/63"],
    id: "0c11cb0e593b0204f65d183cccf33960a37b5a9cc2d30a7d2e186af170686997eb90585
3ad970af6d79ac47577aec21487f9f3138975851a489871a391d73a65",
    name: "Geth/v1.8.4-stable-2423ae01/windows-amd64/go1.10.1",
    network: {
      inbound: false,
      localAddress: "127.0.0.1:60336",
      remoteAddress: "127.0.0.1:30305",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 262144,
        head: "0xa0e580c6769ac3dd80894b2a256164a76b796839d2eb7f799ef6b9850ea5e82
e",
        version: 63
      }
    }
}]
>

发现节点1已经有一个peer了,同时我们可以看到 remoteAddress: "127.0.0.1:30305",正是我们节点2的端口信息。就这样,我们两个节点就互连成功了。

五、查询余额并挖矿

执行查看余额命令:

> eth.getBalance(eth.coinbase)
0

发现两个节点的账户余额都为0。在节点1执行miner.start()进行挖矿,执行 miner.stop() 停止挖矿。我们会发现,当节点1挖矿的同时,节点2会输出这样的信息:

> INFO [09-14|15:08:57] Block synchronisation started
INFO [09-14|15:08:57] Imported new state entries               count=1 elapsed=0
s processed=1 pending=0 retry=0 duplicate=0 unexpected=0
WARN [09-14|15:08:58] Discarded bad propagated block           number=1 hash=56a
e5a…ce9a87
INFO [09-14|15:08:58] Imported new block headers               count=2 elapsed=1
.119s number=2 hash=f2f595…c1d893 ignored=0
INFO [09-14|15:08:59] Imported new chain segment               blocks=2 txs=0 mg
as=0.000 elapsed=1ms    mgasps=0.000 number=2 hash=f2f595…c1d893 cache=348.00B
INFO [09-14|15:09:00] Fast sync complete, auto disabling
INFO [09-14|15:09:02] Imported new chain segment               blocks=1 txs=0 mg
as=0.000 elapsed=5ms    mgasps=0.000 number=3 hash=9b8ba9…62198a cache=496.00B
INFO [09-14|15:09:03] Imported new chain segment               blocks=1 txs=0 mg

这说明节点1在挖矿的同时,节点2在同步数据信息。停止节点1的挖矿,并查看coinbase的地址金额:

> miner.stop()
true
>
> eth.getBalance(eth.coinbase)
70000000000000000000

我们可以看到节点1的coinbase的余额,我们把节点1的地址拿到节点2去查询:

> eth.getBalance("0xed0dfd1c42c18fbf71df07135950d25353a9786c")
70000000000000000000

很显然节点2也能查询到节点1中地址的余额。以上信息说明,节点1和节点2的数据是完全同步的。

六、交易转账

交易前需要将账户解锁,执行解锁命令后,输入之前设置的密码,即可解锁。

> personal.unlockAccount("0xed0dfd1c42c18fbf71df07135950d25353a9786c")
Unlock account 0xed0dfd1c42c18fbf71df07135950d25353a9786c
Passphrase:
true

解锁完之后,就可以给其他账户进行转账操作了。

>eth.sendTransaction({from:eth.coinbase,to:'0x18e95f783866f4404530e13b7e868169db300fdf',value:100000000})
INFO [09-14|15:31:04] Submitted transaction                    fullhash=0xc72175
20e37896eb9421b6139ffb8d650bf933dfcb1efce42ff7ad96c3d57a5a recipient=0x18e95f783
866F4404530e13b7E868169db300fdF
"0xc7217520e37896eb9421b6139ffb8d650bf933dfcb1efce42ff7ad96c3d57a5a"
>

我们给节点2的账户转1个币,现在查看下节点2的地址内是否有余额:

> eth.getBalance("0x18e95f783866f4404530e13b7e868169db300fdf")
0

余额为0,为什么呢?因为我们虽然发起了交易,但是没有矿工挖矿打包交易。执行 miner.start() ,停止挖矿后再次查询,就会发现节点2的地址已经有余额了。

> eth.getBalance("0x18e95f783866f4404530e13b7e868169db300fdf")
100000000

通过以上操作,我们建立了一个拥有两个节点的联盟链,并执行了查询余额、挖矿、转账等操作。如果想建立更多节点的联盟链,可以此添加新的节点。



作者:Garry2018
链接:https://www.jianshu.com/p/2647fd5efbe5
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/u012149181/article/details/84103428