风险提示:理性看待区块链,提高风险意识!
从零构建基于以太坊(Ethereum)钱包Parity联盟链
首页 > 币界资讯 > 区块链知识 2017-11-09 11:23:00

什么情况下可以建立自己测试用的PoA chain?

  • 公司内网或无对外网络,无法同步区块
  • 降低测试时等待区块的时间
  • 不想碰到testrpc各种雷

PoA Chain特点有

  • 有别于PoW(Proof-of-Work)需要解数学难题来产生blockPoA是依靠预设好的Authority nodes,负责产生block
  • 可依照需求设定Authority node数量。
  • 可指定产生block的时间,例如收到交易的5秒后产生block
  • 一般的Ethereum node也可以连接到PoA Chain,正常发起transactionscontracts等。

大纲

  1. Parity钱包下载安装
  2. 设置chain spec
  3. 设置两个节点
  4. 设置账号(Account)
  5. 启动Authority node
  6. 连接两个节点
  7. 发送交易
  8. 分享给其他节点

一、Parity钱包下载安装

之前的教程中我们讲解了Mist钱包、MetaMask、myetherwallet钱包,这篇教程中,我们系统介绍一下Parity钱包的使用,为下一篇文章中联盟链搭建做铺垫。

Parity钱包下载安装https://parity.io。

p1

如官网所示,The fastest and most secure way of interacting with the Ethereum blockchainParity是最快最安全的钱包。

打开官网,我们看到有三种安装方式,第一种,直接下载安装,第二种,Brew安装,第三种,Docker安装。

在我们案例中,我们通过Brew来进行安装。

1、Getting Homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2、Adding Parity to your list of Homebrew ‘kegs’

打开终端,输入下面的命令,按enter。

brew tap paritytech/paritytech

3、Installing Parity

  • 稳定版
brew install parity --stable
  • 最新版
brew install parity
  • 最新开发版
brew install parity --master
  • 更新最新版本
brew update && brew upgrade parity

and

brew reinstall parity

4、查看安装版本

liyuechun:~ yuechunli$ parity --version
Parity
  version Parity/v1.8.2-beta-1b6588c-20171025/x86_64-macos/rustc1.21.0
Copyright 2015, 2016, 2017 Parity Technologies (UK) Ltd
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

By Wood/Paronyan/Kotewicz/Drwięga/Volf
   Habermeier/Czaban/Greeff/Gotchac/Redmann

liyuechun:~ yuechunli$ 

二、设置chain spec

PoA chain 需要设置一个创世区块。

{
  "name": "DemoPoA",
  "engine": {
    "authorityRound": {
      "params": {
        "stepDuration": "5",
        "validators": {
          "list": [

          ]
        }
      }
    }
  },
  "params": {
    "gasLimitBoundDivisor": "0x0400",
    "maximumExtraDataSize": "0x20",
    "minGasLimit": "0x1388",
    "networkID": "0x2323"
  },
  "genesis": {
    "seal": {
      "authorityRound": {
        "step": "0x0",
        "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
      }
    },
    "difficulty": "0x20000",
    "gasLimit": "0x5B8D80"
  },
  "accounts": {
    "0x0000000000000000000000000000000000000001": {
      "balance": "1",
      "builtin": {
        "name": "ecrecover",
        "pricing": {
          "linear": {
            "base": 3000,
            "word": 0
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000002": {
      "balance": "1",
      "builtin": {
        "name": "sha256",
        "pricing": {
          "linear": {
            "base": 60,
            "word": 12
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000003": {
      "balance": "1",
      "builtin": {
        "name": "ripemd160",
        "pricing": {
          "linear": {
            "base": 600,
            "word": 120
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000004": {
      "balance": "1",
      "builtin": {
        "name": "identity",
        "pricing": {
          "linear": {
            "base": 15,
            "word": 3
          }
        }
      }
    }
  }
}
  • stepDuration 设定成5秒产生一个区块。
  • validators 设定Authority的地方,目前先空著,后面创建account之后再回来填入。

将上面的文件保存到桌面的一个文件中,保存为demo-spec.json

三、设置两个节点

在我们这篇文章中,我们在同一台电脑设置两个节点,跟我们讲解以太坊私网建立 (2) – 同一台电脑/不同电脑运行多个节点时,如果在同一台电脑设置两个节点,需要将rpcportport设置为不同的值,否则就会发生冲突,POA chain中也是一样,需要将一些参数设置为不同的值。

  • -d:指定存储资料与账号的目录
  • --dport:指定Paritynetwork port,可用来让其他node连接
  • --jsonrpc-port:这是JSON RPC port,使用web3.js时会需要
  • ui-portParity提供的Web-based UI port

可以用下列指令启动Parity node

parity --chain demo-spec.json -d parity0 --port 30300  --ui-port 8180  --jsonrpc-port 8540 --jsonrpc-apis web3,eth,net,personal,parity,parity_set,traces,rpc,parity_accounts

除了打一长串的指令外,Parity也提供更为简洁的config档案设定方式,使用 --config 即可引用配置文件。

  • node0 使用如下配置文件 node0.toml
[parity]
chain = "demo-spec.json"
base_path = "parity0"
[network]
port = 30300
[rpc]
port = 8540
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8180
[websockets]
port = 8456
  • node1 使用如下配置文件 node1.toml
[parity]
chain = "demo-spec.json"
base_path = "parity1"
[network]
port = 30301
[rpc]
port = 8541
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8181
[websockets]
port = 8457

四、设置账号(Account)

我们总共需要设置三个账号,两个Authority和一个user账号。

第一步:首先启动node0 : parity --config node0.toml


node0

打开网页http://localhost:8180,按照步骤创建一个用户账号。

p2
p3
p4
p5
p6
p7

  • 新增Authority account,使用Restore功能,为了示范一致性,我们使用 node0 当作 pass phrase

p8
p9
p10

到目前为止我们已经完成node0的账号设置。

  • Authority account:0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e
  • User account:0x0064B0999c0142eE99aB0ceC054BAb53fe0a3EcC

第二步:设置node1的账号,启动parity --config node1.toml。步骤相同,连接到 http://localhost:8181 ,pass phrase使用 node1

p11

p12

这样就完成了node1的账号设置。

  • Authority account:0x00F9B30838ca40c8A53c672840acbDec6fCDb180

第三步:将Authority account 写入 demo-spec.json 文件

"validators": {
  "list": [
    "0x00F9B30838ca40c8A53c672840acbDec6fCDb180",
    "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e"
  ]
}

再将user account加入accounts,並给一些balance,后续可以使用。

"0x0064B0999c0142eE99aB0ceC054BAb53fe0a3EcC": {
  "balance": "10000000000000000000000"
}

完成后的demo-spec.json如下:

{
  "name": "DemoPoA",
  "engine": {
    "authorityRound": {
      "params": {
        "stepDuration": "5",
        "validators": {
          "list": [
            "0x00F9B30838ca40c8A53c672840acbDec6fCDb180",
            "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e"
          ]
        }
      }
    }
  },
  "params": {
    "gasLimitBoundDivisor": "0x0400",
    "maximumExtraDataSize": "0x20",
    "minGasLimit": "0x1388",
    "networkID": "0x2323"
  },
  "genesis": {
    "seal": {
      "authorityRound": {
        "step": "0x0",
        "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
      }
    },
    "difficulty": "0x20000",
    "gasLimit": "0x5B8D80"
  },
  "accounts": {
    "0x0000000000000000000000000000000000000001": {
      "balance": "1",
      "builtin": {
        "name": "ecrecover",
        "pricing": {
          "linear": {
            "base": 3000,
            "word": 0
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000002": {
      "balance": "1",
      "builtin": {
        "name": "sha256",
        "pricing": {
          "linear": {
            "base": 60,
            "word": 12
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000003": {
      "balance": "1",
      "builtin": {
        "name": "ripemd160",
        "pricing": {
          "linear": {
            "base": 600,
            "word": 120
          }
        }
      }
    },
    "0x0064B0999c0142eE99aB0ceC054BAb53fe0a3EcC": {
      "balance": "10000000000000000000000"
    },
    "0x0000000000000000000000000000000000000004": {
      "balance": "1",
      "builtin": {
        "name": "identity",
        "pricing": {
          "linear": {
            "base": 15,
            "word": 3
          }
        }
      }
    }
  }
}

五、启动Authority node

为了启动Authority node来产生区块,我们必须设定负责产生blocksigner,分別是 node0 和 node1 account

1、第一步,创建一个node.pwds文件,写入node0node1password,内容如下:

node0
node1

2、第二步,在node0.toml文件中加入[account]及[mining]设置,如下:

[parity]
chain = "demo-spec.json"
base_path = "parity0"
[network]
port = 30300
[rpc]
port = 8540
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8180
[account]
password = ["node.pwds"]
[mining]
engine_signer = "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e"
reseal_on_txs = "none"

3、第三步,在node1.toml文件中加入[account]及[mining]设置,如下:

[parity]
chain = "demo-spec.json"
base_path = "parity1"
[network]
port = 30301
[rpc]
port = 8541
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8181
[websockets]
port = 8457
[account]
password = ["node.pwds"]
[mining]
engine_signer = "0x00F9B30838ca40c8A53c672840acbDec6fCDb180"
reseal_on_txs = "none"

4、第四步,Step 4 分別启动两个node

parity --config node0.toml
parity --config node1.toml

六、连接两个节点

使用Postman透过JSON RPC来测试。

1、第一步,Post下列JSON数据至 http://localhost:8540 以取得 node0 的enode资料

{
 "jsonrpc":"2.0",
 "method":"parity_enode",
 "params":[],
 "id":0
}

p13

获取到的数据如下:

{
    "jsonrpc": "2.0",
    "result": "enode://cfb3af513da3a7a8138450f0dc01fa38cb2ac837744dc645038940287f4dce3f416f0e7e17fd10619a263c360d9324fd2dcd8753c4500fcc54cf84e076b39cd6@192.168.10.101:30300",
    "id": 0
}

"enode://cfb3af513da3a7a8138450f0dc01fa38cb2ac837744dc645038940287f4dce3f416f0e7e17fd10619a263c360d9324fd2dcd8753c4500fcc54cf84e076b39cd6@192.168.10.101:30300"node0的标识。下一步中我们将将它加入到node1中以实现两个节点之间的连接。

2、第二步,将 node0 的enode加入 node1 ,Post下列JSONs数据至node1 (http://localhost:8541 )

{
 "jsonrpc":"2.0",
 "method":"parity_addReservedPeer",
 "params":["enode://cfb3af513da3a7a8138450f0dc01fa38cb2ac837744dc645038940287f4dce3f416f0e7e17fd10619a263c360d9324fd2dcd8753c4500fcc54cf84e076b39cd6@192.168.10.101:30300"],
 "id":0
}

p14

返回的数据如下,result为true,说明连接成功:

{
    "jsonrpc": "2.0",
    "result": true,
    "id": 0
}

再切换到node1的终端,会看到下面的数据:

1/25 peers   13 KiB chain 11 KiB db 0 bytes queue 10 KiB sync  RPC:  0 conn,  0 req/s,  24 µs

p15

如上图所示,表示连接成功。

七、发送交易

在我们这个案例中,我们一个创建了三个账号,一个用户账号,两个POA账号,刚开始的时候我们为用户账号初始化了10000 ETH。如下图所示,账号与账号之间可以相互转账。

p16

p18
p19
p20

八、分享给其他节点

在开发时通常会将node跑在server上,让其他人可以通过JSON RPC port连接上去使用,此时只要在config文件里面加入 [interface] 设置即可。

假设server ip192.168.1.5,将 node0.toml 修改如下:

[parity]
chain = "demo-spec.json"
base_path = "parity0"
[network]
port = 30300
[rpc]
port = 8540
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
interface = "192.168.1.5"
[ui]
port = 8180
[account]
password = ["node.pwds"]
[mining]
engine_signer = "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e"
reseal_on_txs = "none"

node1.toml 修改如下:

[parity]
chain = "demo-spec.json"
base_path = "parity1"
[network]
port = 30301
[rpc]
port = 8541
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
interface = "192.168.1.5"
[ui]
port = 8181
[websockets]
port = 8457
[account]
password = ["node.pwds"]
[mining]
engine_signer = "0x00F9B30838ca40c8A53c672840acbDec6fCDb180"
reseal_on_txs = "none"

技术交流

  • 区块链技术交流QQ群:348924182
  • 「区块链部落」官方公众号
上一篇: 什么是plasma?Plasma如何解决区块链可扩展性问题?
下一篇: parity多签名合约漏洞分析
推荐专栏
web3首席知识博主
一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
爱Web 3,爱生活,爱科技,爱炒币的老韭菜
热门币种
更多
币种
价格
24H涨跌幅
BTC比特币
¥264,810.46
37,103.37 USDT
+0.1%
ETH以太坊
¥14,413.37
2,019.50 USDT
0%
USDT泰达币
¥7.20
1.01 USDT
0%
BNB币安币
¥1,629.54
228.32 USDT
+0.63%
XRP瑞波币
¥4.32
0.60480 USDT
+0.45%
USDC
¥7.14
1.00 USDT
+0.04%
SOLSolana
¥400.45
56.11 USDT
+1.59%
OKBOK币
¥399.37
55.96 USDT
-1.23%
ADA艾达币
¥2.67
0.37480 USDT
-1.32%
DOGE狗狗币
¥0.55330
0.07753 USDT
-1.01%
热搜币种
更多
币种
价格
24H涨跌幅
Terra Classic
¥0.00
9.481E-5 USDT
-18.15%
Gala
¥0.18
0.025383 USDT
-4.86%
dYdX
¥22.63
3.1984 USDT
-0.73%
比特股
¥0.05
0.006569 USDT
-1.93%
PancakeSwap
¥15.60
2.2054 USDT
-2.16%
Conflux
¥1.08
0.1531 USDT
-2.36%
Filecoin
¥31.55
4.4597 USDT
-0.5%
FTX Token
¥29.65
4.1911 USDT
+15.24%
Yield Guild Games
¥2.56
0.3615 USDT
-0.55%
Shiba Inu
¥0.00
8.15E-6 USDT
-2.16%
比特币
¥262,467.38
37103.37 USDT
+0.1%
比原链
¥0.07
0.010022 USDT
-4.68%
最新快讯
更多
汇丰、恒生、渣打、富邦华一四家外资银行入围首批“数字人民币”业务试点名单
2023-11-28 19:06:57
摩根大通和Apollo计划建立代币化“企业主网”
2023-11-28 19:03:57
Nansen2公测版本上线,新增链上数据异动、智能搜索等功能
2023-11-28 18:59:52
西班牙公民需在明年3月底前申报其海外平台上加密货币持仓
2023-11-28 18:53:43
Nansen2已公开测试
2023-11-28 18:53:38
dYdX基金会:主网启动以来超过1645万DYDX被质押
2023-11-28 18:52:07
NicCarter等比特币倡导者发文:比特币挖矿是清洁能源和平衡电网的关键工具
2023-11-28 18:47:58
下载币界网APP