美文网首页
基于Parity从零构建联盟链

基于Parity从零构建联盟链

作者: arthur25 | 来源:发表于2019-01-16 10:44 被阅读9次

    参考:http://www.8btc.com/ethereum-parity

    https://wiki.parity.io/Demo-PoA-tutorial
    什么情况下可以建立自己测试用的PoA chain?

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

    Parity POA官方文档:https://wiki.parity.io/Demo-PoA-tutorial
    Parity UI:https://wiki.parity.io/Parity-Wallet

    PoA Chain特点有

    • 有别于PoW(Proof-of-Work)需要解数学难题来产生block,PoA是依靠预设好的Authority nodes,负责产生block。
    • 可依照需求设定Authority node数量。
    • 可指定产生block的时间,例如收到交易的5秒后产生block。
    • 一般的Ethereum node也可以连接到PoA Chain,正常发起transactions,contracts等。
      大纲
    1. Parity钱包下载安装
    2. 设置chain spec
    3. 设置两个节点
    4. 设置账号(Account)
    5. 启动Authority node
    6. 连接两个节点
    7. 发送交易
    8. 分享给其他节点
      一、Parity钱包下载安装

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

    Parity钱包下载安装https://parity.io
    安装Parity各系统参考:https://github.com/paritytech/parity-ethereum

    例:Mac下通过Homebrew来安装。
    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、查看安装版本

    parity --version
    二、设置chain spec

    {
    "name": "DemoPoA",
    "engine": {
    "authorityRound": {
    "params": {
    "stepDuration": "5",
    "validators" : {
    "list": []
    }
    }
    }
    },
    "params": {
    "gasLimitBoundDivisor": "0x400",
    "maximumExtraDataSize": "0x20",
    "minGasLimit": "0x1388",
    "networkID" : "0x2323",
    "eip155Transition": 0,
    "validateChainIdTransition": 0,
    "eip140Transition": 0,
    "eip211Transition": 0,
    "eip214Transition": 0,
    "eip658Transition": 0
    },
    "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) – 同一台电脑/不同电脑运行多个节点时,如果在同一台电脑设置两个节点,需要将rpcport和port设置为不同的值,否则就会发生冲突,POA chain中也是一样,需要将一些参数设置为不同的值。

    • -d:指定存储资料与账号的目录
    • --dport:指定Parity的network port,可用来让其他node连接
    • --jsonrpc-port:这是JSON RPC port,使用web3.js时会需要
    • ui-port:Parity提供的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 = 8450
    • 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 = 8451
      [ipc]
      disable = true
    • base_path是指与parity demo-spec.json 同级的目录路径
      我们将创建三个帐户:两个权限和一个用户帐户。这里只记录两种:
      方法1.使用RPC

    使用启动节点0 parity --config node0.toml。
    RPC可以通过访问web3,parity.js或简单地使用curl。这将创建第一个权限地址:
    curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["node0", "node0"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540
    返回的地址应该是0x00bd138abd70e2f00903268f3db08f2d25677c9e。
    用户地址:
    curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["user", "user"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540
    返回的地址应该是0x004ec07d2329997267ec62b4166639513386f32e。
    现在启动另一个节点parity --config node1.toml并创建第二个权限帐户:
    curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["node1", "node1"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8541
    返回的地址应该是0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2。
    方法2.使用UI

    1. 使用启动节点0 parity --config node0.toml
    2. 启动Parity UI并完成初始设置
    3. 点击“RESTORE ACCOUNT”
    4. 使用短语“node0”和密码“node0”
    5. 新创建的帐户应该有地址 0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e
    6. 现在从另一个短语“用户”和密码“用户”恢复,这将导致帐户0x004ec07d2329997267ec62b4166639513386f32e
    7. 使用启动节点1 parity --config node1.toml
    8. 去 localhost:8181
    9. 再次从短语“node1”和密码“node1”中恢复,这将创建帐户 0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2
      3.完成链规范
      如果帐户是根据短语创建的,我们现在应该进行以下设置:
    • 节点0具有0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e权限帐户和0x004ec07d2329997267Ec62b4166639513386F32E用户帐户
    • 节点1具有0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2权限帐户

    现在可以将帐户添加到spec文件中。打开demo-spec.json备份并将我们刚创建的权限添加到"validators"数组中:
    "validators" : {
    "list": [
    "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e",
    "0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2"
    ]
    }
    然后将我们的用户帐户添加到创世纪,以便我们有一些平衡发送:
    "0x004ec07d2329997267ec62b4166639513386f32e": { "balance": "10000000000000000000000" }
    完整demo-spec.json应该如下所示:
    {
    "name": "DemoPoA",
    "engine": {
    "authorityRound": {
    "params": {
    "stepDuration": "5",
    "validators" : {
    "list": [
    "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e",
    "0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2"
    ]
    }
    }
    }
    },
    "params": {
    "gasLimitBoundDivisor": "0x400",
    "maximumExtraDataSize": "0x20",
    "minGasLimit": "0x1388",
    "networkID" : "0x2323",
    "eip155Transition": 0,
    "validateChainIdTransition": 0,
    "eip140Transition": 0,
    "eip211Transition": 0,
    "eip214Transition": 0,
    "eip658Transition": 0
    },
    "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 } } } },
    "0x004ec07d2329997267Ec62b4166639513386F32E": { "balance": "10000000000000000000000" }
    }
    }
    4.运行授权节点

    现在规范已经完成,我们可以启动将运行链的两个节点。要将节点作为权限运行,我们需要启用它来签署共识消息。
    首先,让我们用节点密码创建一个文件node.pwds。每行将包含我们在创建权限帐户时使用的密码,要存储在名为node.pwds的文件中的内容为:
    node0
    node1
    现在我们可以添加engine-signer到配置文件中。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 = 8450
    [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"]
    [ui]
    port = 8181
    [websockets]
    port = 8451
    [ipc]
    disable = true
    [account]
    password = ["node.pwds"]
    [mining]
    engine_signer = "0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2"
    reseal_on_txs = "none"
    现在可以启动这两个节点。节点0:
    parity --config node0.toml
    和节点1:
    parity --config node1.toml
    5.连接节点

    为了确保节点彼此连接,我们需要知道它们的enode地址并通知另一个节点。有三种方法可以获得enode:

    • RPC
    • UI(在页脚中)
    • 启动控制台输出
      获得后,可以将它们作为引导节点添加到demo-spec.json保留对等体中。
      在这里我们将简单地使用curl。获取节点0 enode:
      curl --data '{"jsonrpc":"2.0","method":"parity_enode","params":[],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540

    将“结果”添加到节点1(enode://RESULT在命令中替换):
    curl --data '{"jsonrpc":"2.0","method":"parity_addReservedPeer","params":["enode://RESULT"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8541

    现在节点应该0/1/25 peers在控制台中指示,这意味着它们彼此连接。
    6.发送交易

    发送事务的两种主要方式是RPC和UI。
    RPC

    从用户帐户向权限node0发送一些令牌:
    2b5e3af16b1880000
    curl --data '{"jsonrpc":"2.0","method":"personal_sendTransaction","params":[{"from":"0x004ec07d2329997267Ec62b4166639513386F32E","to":"0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e","value":"0xde0b6b3a7640000"}, "user"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540

    提交请求后,应在几秒钟后发出阻止。您可以检查其他帐户是否收到了资金:
    curl --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", "latest"],"id":1}' -H "Content-Type: application/json" -X POST localhost:8540

    我们还可以将一些发送到另一个节点上的帐户:
    curl --data '{"jsonrpc":"2.0","method":"personal_sendTransaction","params":[{"from":"0x004ec07d2329997267Ec62b4166639513386F32E","to":"0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2","value":"0xde0b6b3a7640000"}, "user"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540

    并检查是否收到询问另一个节点:
    curl --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2", "latest"],"id":1}' -H "Content-Type: application/json" -X POST localhost:8541
    7.进一步发展

    您现在可以创建更多帐户,发送价值,编写合同并进行部署。用于开发和使用以太坊网络的所有工具也可用于此网络。
    要在多台计算机上部署Parity,您可能会发现docker构建很有用。
    要添加非授权节点,可以使用以下更简单的配置:
    [parity]
    chain = "demo-spec.json"
    base_path = "/tmp/parity2"
    [network]
    port = 30302
    [rpc]
    port = 8542
    apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
    [ui]
    port = 8182
    [websockets]
    port = 8452
    [ipc]
    disable = true
    然后,帐户和连接节点可以与权限节点相同。为了确保接受事务,权限也可以在usd_per_tx = "0"字段下运行[mining]。任何提交交易的节点都可以免费提供。
    在不同的机器上运行节点时,大多数字段都是冗余的,因此基本配置只有链和可能的RPC apis:
    [parity]
    chain = "demo-spec.json"
    [rpc]
    apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts”]
    或者只是跑parity --chain demo-spec.json!

    • 补充:分享给区网内其他人使用
      在开发时通常会将node跑在server上,让其他人可以透过JSON RPC port连接上去使用,此时只要在config里面加入 [interface] 设定即可。
      假设server ip为192.168.1.1,将 node0.toml 修改如下:
      [rpc]
      port = 8540
      apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
      interface = "192.168.1.1"

      • 坑点:我在使用时,使用Vmware虚拟机搭建,parity默认绑定的是本机的IP,导致外部一直不能访问,写入interface = "0.0.0.0"后解决外部访问问题。

      *在JSONRPC接口的调用过程中,如果遇到跨域问题,需要在配置文件中添加cors=all 或者 cors=
      [rpc]
      cors = ["all"]

      **钱包交易转账时,可能会遇到交易接口调用成功,但balance并没有发生变化的情况,你需要用以下命令启动:
      parity --config node0.toml --nat extip:X.X.X.X

      **如果你需要获取钱包的操作记录,你需要给你的钱包开启此功能,在配置文件中添加如下:
      [footprint]
      tracing = "on"
      然后调用trace_filter接口即可,但此功能比较占用服务资源,如果不是特别需要,建议不要开启。

    相关文章

      网友评论

          本文标题:基于Parity从零构建联盟链

          本文链接:https://www.haomeiwen.com/subject/fnipdqtx.html