https://www.cnblogs.com/sumingk/articles/9097996.html

上一篇文章介绍了以太坊私有链 geth节点的搭建,本篇介绍下企业级应用 联盟链搭建,运用parity 钱包作为服务节点,实现多节点构建联盟链。

一.parity的实现共识POA

了解区块链的同学,应该都听过pow,pos这些共识算法,那parity的poa是一种什么样的工作原理呢?poa全称 Proof of Authority ,工作权益证明。

poa的特点:

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

二.parity 下载安装

parity github: https://github.com/paritytech/parity

parity 下载地址:https://github.com/paritytech/parity/releases

选择稳定版  Parity 1.10.4-stable

根据自身linux 系统版本,下载对应的二进制文件

我这边用的ubuntu 16.04  x64

1.wget  https://d1h4xl4cr1h0mo.cloudfront.net/v1.10.4/x86_64-unknown-linux-gnu/parity #下载

2.chmod 775 parity  #修改可执行文件

3. ./parity -v  #检查parity 版本

若显示v1.10.4 版本信息,则已成功安装

三.配置创世区块 genesis-spec.json

>$ mkdir parity

>$ cd parity

>$vim genesis-spec.json

{
    "name": "DemoPoA",
    "engine": {
        "authorityRound": {
            "params": {
                "stepDuration": "2",
                "validators" : {
                    "list": []
                }
            }
        }
    },
"params": {
"gasLimitBoundDivisor": "0x400",
        "maximumExtraDataSize": "0x20",
        "minGasLimit": "0x1388",
        "networkID" : "0x2323"
    },
    "genesis": {
        "seal": {
            "authorityRound": {
                "step": "0x0",
                "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
            }
        },
        "difficulty": "0x10000",
        "gasLimit": "0x12a05f200"
    },
    "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 } } } },
        "0x6a67f9275dfe3abac6fd5525dec804551cbb7f00": { "balance": "1000000000000000000000000" },
        "0xd62de1cbcf85253b776305ab45fd85367187bc29": { "balance": "1000000000000000000000000" }
    }
}

name:创世文件名称

engine:节点引擎,这里先用写死验证人方式,在list 中添加验证人地址

params: networkID 联盟链节点ID

accounts:初始化账户

友情提示:更详细配置可参考parity wiki : https://wiki.parity.io/Chain-specification

四.添加节点配置文件

>$ vim node1.toml

[parity]
chain = "genesis-spec.json" #创世区块文件
base_path = "parity0" #创建parity0文件夹,代表第一个节点
[network]
port = 30300 #网络端口
[rpc]
port = 8540 #rpc请求端口
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"] #支持的rpc请求方式
#interface = "192.168.1.175" #默认的rpc 请求地址
[ui]
port = 8180 #parity ui网页端口
hosts = ["all"]
[account]
password = ["node.pwds"] #节点parity0密码
[websockets]
port = 8456
[ipc]
disable = true  #不支持ipc 访问
[mining]
engine_signer = "0x005C6F320C425675bAE78BcF693AE2e6d63e9853"  #矿工地址
reseal_on_txs = "none"

五.创建用户名密码存储文件

>$ touch node.pwds (创建节点矿工密码)

>$ vim node.pwds

123

六.创建节点关联文件

>$  touch reservedPeers.enode (暂时创建,创建第一个节点时,在补充)

七.创建初始化用户

>$ ./parity account new --config node0.toml

八.修改创世文件 genesis-spec.json 添加验证人

{
"name": "DemoPoA",
"engine": {
"authorityRound": {
"params": {
"stepDuration": "2",
"validators" : {
"list": ["0x6a67f9275dfe3abac6fd5525dec804551cbb7f00"]
                }
}
}
},
"params": {
"gasLimitBoundDivisor": "0x400",
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"networkID" : "0x2323"
},
"genesis": {
"seal": {
"authorityRound": {
"step": "0x0",
"signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
}
},
"difficulty": "0x10000",
"gasLimit": "0x12a05f200"
},
"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 } } } },
"0x6a67f9275dfe3abac6fd5525dec804551cbb7f00": { "balance": "1000000000000000000000000" },
"
0x6a67f9275dfe3abac6fd5525dec804551cbb7f00": { "balance": "1000000000000000000000000" }
} }

九.修改配置节点

十.启动parity

>$ ./parity --config node1.toml

目前一个parity节点已经搭建完毕。

十一.采用合约管理节点验证人(可通过合约动态管理)

以下是完整 genesis-spec.json 文件配置

{
"name": "DemoPoA",
"engine": {
"authorityRound": {
"params": {
"stepDuration": "5",
"validators": {
"safeContract":"0x0000000000000000000000000000000000000005"
}
}
}
},
"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
}
}
}
},
"0x00A7135cf451B2463517D11e0cE88013042e0a28": {
"balance": "80000000000000000000000"
},
"0x0000000000000000000000000000000000000005":{
"balance": "1",
"constructor":"0x606060405260008054600160a060020a0319169055341561001f57600080fd5b6020604051908101604052725c6f320c425675bae78bcf693ae2e6d63e9853815261004e906002906001610131565b5061006464010000000061017a61006982021704565b6101ff565b600554600090819060ff161561007e57600080fd5b600091505b60025482101561010357600280548390811061009b57fe5b600091825260209091200154600160a060020a03169050604080519081016040908152600182526020808301859052600160a060020a03841660009081526004909152208151815460ff19169015151781556020820151600191820155929092019150610083565b6005805460ff1916600190811790915560028054610122929190610198565b50506003805460ff1916905550565b828054828255906000526020600020908101928215610188579160200282015b828111156101885782518254600160a060020a031916600160a060020a039190911617825560209290920191600190910190610151565b506101949291506101d8565b5090565b8280548282559060005260206000209081019282156101885760005260206000209182015b828111156101885782548255916001019190600101906101bd565b6101fc91905b80821115610194578054600160a060020a03191681556001016101de565b90565b61073c8061020e6000396000f3006060604052600436106100775763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305c81865811461007c578063170f92911461009157806340a141ff146100c35780634d238c8e146100e25780637528621114610101578063b7ab4db514610114575b600080fd5b341561008757600080fd5b61008f61017a565b005b341561009c57600080fd5b6100a7600435610242565b604051600160a060020a03909116815260200160405180910390f35b34156100ce57600080fd5b61008f600160a060020a036004351661026a565b34156100ed57600080fd5b61008f600160a060020a03600435166103b7565b341561010c57600080fd5b61008f610464565b341561011f57600080fd5b61012761052f565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561016657808201518382015260200161014e565b505050509050019250505060405180910390f35b600554600090819060ff161561018f57600080fd5b600091505b6002548210156102145760028054839081106101ac57fe5b600091825260209091200154600160a060020a03169050604080519081016040908152600182526020808301859052600160a060020a03841660009081526004909152208151815460ff19169015151781556020820151600191820155929092019150610194565b6005805460ff191660019081179091556002805461023392919061063a565b50506003805460ff1916905550565b600180548290811061025057fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a03811660009081526004602052604081205481908190849060ff16156103b057600160a060020a038516600090815260046020526040902060010154600280549195506000198201945090849081106102c657fe5b60009182526020909120015460028054600160a060020a0390921693508391869081106102ef57fe5b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039485161790559184168152600490915260409020600101849055600280548490811061034657fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19169055600280549061037f90600019830161068a565b50600160a060020a03851660009081526004602052604081206001810191909155805460ff191690556103b0610598565b5050505050565b600160a060020a038116600090815260046020526040902054819060ff1615156104605760028054600160a060020a03841660009081526004602052604090206001908101829055810161040b838261068a565b506000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03861690811790915582526004905260409020805460ff19166001179055610460610598565b5050565b60005433600160a060020a039081169116141580610484575060035460ff165b1561048e57600080fd5b6002805461049e9160019161063a565b506003805460ff191660019081179091557f8564cd629b15f47dc310d45bcbfc9bcf5420b0d51bf0659a16c67f91d27632539060405160208082528254908201819052819060408201908490801561051f57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610501575b50509250505060405180910390a1565b6105376106b3565b600180548060200260200160405190810160405280929190818152602001828054801561058d57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161056f575b505050505090505b90565b60035460ff1615156105a957600080fd5b6003805460ff191690556000194301407f55252fa6eee4741b4e24a74a70e9c11fd2c2281df8d6ea13126ff845f7825c89600260405160208082528254908201819052819060408201908490801561062a57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161060c575b50509250505060405180910390a2565b82805482825590600052602060002090810192821561067a5760005260206000209182015b8281111561067a57825482559160010191906001019061065f565b506106869291506106c5565b5090565b8154818355818115116106ae576000838152602090206106ae9181019083016106f6565b505050565b60206040519081016040526000815290565b61059591905b8082111561068657805473ffffffffffffffffffffffffffffffffffffffff191681556001016106cb565b61059591905b8082111561068657600081556001016106fc5600a165627a7a72305820e802334540c1fab99433710f3e01f32156cca8fb5321c2d69963ee71a09b944b0029"
}
}
}

下面是动态管理验证人的合约

pragma solidity ^0.4.15;
contract ValidatorSet {
event InitiateChange(bytes32 indexed _parent_hash, address[] _new_set);
function getValidators() public constant returns (address[] _validators);
function finalizeChange() public;
}
contract MajorityList is ValidatorSet {
event ChangeFinalized(address[] current_set);
struct ValidatorStatus {
bool isValidator;
uint index;
}
address SYSTEM_ADDRESS = 0x0000000000000000000000000000000000000000;
address[] public validatorsList;
address[] pendingList;
bool finalized;
mapping(address => ValidatorStatus) validatorsStatus;
bool private initialized;
function MajorityList() public {
pendingList = [0x005C6F320C425675bAE78BcF693AE2e6d63e9853];
initializeValidators();
}
modifier uninitialized() {
if (initialized) { revert();}
_;
}
modifier when_finalized() {
if (!finalized) { revert();}
_;
}
modifier only_system_and_not_finalized() {
if (msg.sender != SYSTEM_ADDRESS || finalized) { revert(); }
_;
}
modifier is_validator(address someone) {
if (validatorsStatus[someone].isValidator) { _; }
}
modifier is_not_validator(address someone) {
if (!validatorsStatus[someone].isValidator) { _; }
}
function initializeValidators() public uninitialized {
for (uint j = 0; j < pendingList.length; j++) {
address validator = pendingList[j];
validatorsStatus[validator] = ValidatorStatus({
isValidator: true,
index: j
});
}
initialized = true;
validatorsList = pendingList;
finalized = false;
}
function initiateChange() private when_finalized {
finalized = false;
emit InitiateChange(block.blockhash(block.number - 1), pendingList);
}
function finalizeChange() public only_system_and_not_finalized {
validatorsList = pendingList;
finalized = true;
emit ChangeFinalized(validatorsList);
}
function addValidator(address validator) public is_not_validator(validator){
validatorsStatus[validator].index = pendingList.length;
pendingList.push(validator);
validatorsStatus[validator].isValidator = true;
initiateChange();
}
function removeValidator(address validator) public is_validator(validator){
uint removedIndex = validatorsStatus[validator].index;
uint lastIndex = pendingList.length-1;
address lastValidator = pendingList[lastIndex]; pendingList[removedIndex] = lastValidator;
validatorsStatus[lastValidator].index = removedIndex; delete pendingList[lastIndex];
pendingList.length--; validatorsStatus[validator].index = 0;
validatorsStatus[validator].isValidator = false;
initiateChange(); }
function getValidators() public constant returns (address[]) {
return validatorsList;
}
}

这部分代码有过更改,为了适应parity 部署。

获取合约 二进制文件 bytecode 的几种方式

1.如果parity 已经能启动UI界面, 部署合约(有可能parity钱包不能编译)

2.使用上一篇文章 geth 搭建的mist钱包编译 可获得二进制文件 : https://www.cnblogs.com/sumingk/articles/9030469.html

我这里是使用Mist 钱包编译的合约,parity 节点部署的合约有时一直加载不出来

十二.编辑 reservedPeers.enode 文件,添加节点信息

要是添加多个parity 需要在reservedPeers.enode 添加对方enode

启动节点  ./parity  --config node1.toml

以太坊联盟链 parity 节点搭建的更多相关文章

  1. 区块链--Ubuntu上搭建以太坊私有链

    1.搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:https://githu ...

  2. 转:使用 Go-Ethereum 1.7.2搭建以太坊私有链

    使用 Go-Ethereum 1.7.2搭建以太坊私有链 目录 [toc] 1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底 ...

  3. Mac环境搭建以太坊私有链

    原文地址: 石匠的blog 为了测试以太坊智能合约,最方便的是在本地搭建一个以太坊私有链.在mac上搭建环境主要需要以下步骤. geth安装 geth是go-ethereum的简写,是一个用go语言编 ...

  4. geth搭建以太坊私链及常用操作

    一.下载安装geth客户端 https://www.ethereum.org/ 二.搭建私有链 1.准备创世区块配置文件 要运行私有链,我们就需要定义自己的创世区块,创世区块信息写在一个json格式的 ...

  5. 使用 Go-Ethereum 1.7.2搭建以太坊私有链

    目录 [toc] 1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球 ...

  6. 区块链学习(四)truffle部署编译智能合约以太坊私有链

    前面我们介绍了以太坊私有链的搭建以及多节点私有链网络,这次我们介绍如何使用truffle框架来部署编译智能合约到我们之前搭建的私有链网络中. 搭建环境及需使用的工具:ubuntu18.04  Truf ...

  7. 以太坊区块链Java(EthereumJ)学习笔记:概述

    本系列文章介绍以太坊区块链基于Java语言的解决方案.通过介绍EthereumJ定义的主要模块和Class,希望为大家学习和使用EthereumJ提供一些帮助. 整体架构 以太坊的Java解决方案主要 ...

  8. 使用Geth 构建以太坊区块链并模拟挖矿过程

    使用Geth 构建以太坊区块链并模拟挖矿过程 Go-ethereum 是以太坊官方的一个Golang 实现,我们可以使用Geth 工具来创建创世区块并启动区块链,使用Clef 实现以太坊钱包的功能,以 ...

  9. 区块链入门(2):搭建以太坊私有链(private network of ethereum),以及挖矿的操作..

    在做一些测试工作的时候, 为了方便控制以及更快的进入真正的测试工作,可能需要搭建一个私有的以太坊网络. 而以太坊节点之间能够互相链接需要满足1)相同的协议版本2)相同的networkid,所以搭建私有 ...

随机推荐

  1. wangeditor富编辑器在node和vue前后台分离的使用

    本来是想用百度的ueditor编辑器来达到想要的功能的,但在使用中,感觉前后台分离上,需要引入的东西过多,不轻量:然后就去尝试用wangeditor(这个名字听着感觉有点太随意的感觉....但功能上还 ...

  2. [Vuex系列] - Actions的理解之我见

    Actions如何定义的 恕小端不才,对Action的总结如下: Action 可以提交mutation方法,通过mutation来改变state Action 函数可以接收一个context对象,通 ...

  3. [LeetCode] 206. Reverse Linked List ☆(反转链表)

    Reverse Linked List 描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL    输出: 5->4->3-> ...

  4. ip地址、域名、DNS、URL(即网址)的区别与联系

    域名和ip ================================================================ 我们也知道每一台机都有一个唯一ip地址, 特别难记,所以出 ...

  5. centos 6升级 GCC 到4.8

    centos 6升级 GCC 到4.8   安装最新版本的swoole 提示 pecl install swolle ... GCC 4.8 or later required. 首先想到的时候yum ...

  6. mysql5.6快速安装及参数详解

    一.所需软件 软件名称 版本 下载地址 当前环境 管理员账号/密码 mysql 5.6 yum安装 centOS6.7系统 zxfly/zxfly 二.安装说明 数据库所在目录 /database/m ...

  7. Djang drf:APIView源码分析

    Django REST framework 简介   在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的.        开发REST AP ...

  8. 12.自定义v-过渡动画前缀

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  9. Linux下 expect 使用详解与实例

    一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而Expec ...

  10. java学习笔记14-多态

    多态可以理解为同一个操作在不同对象上会有不同的表现 比如在谷歌浏览器上按F1会弹出谷歌的帮助页面.在windows桌面按F1会弹出windows的帮助页面. 多态存在的三个必要条件: 继承 重写 父类 ...