Skip to content
ningxin edited this page Mar 29, 2019 · 1 revision

委员会简介

​ 委员会是独立于usechain主链节点之外的节点,负责usechain的身份验证和投票,共5个委员会节点,需要同时开启连接主链节点,并进行互联。

​ 委员会管理合约的地址:0xfffffffffffffffffffffffffffffffff0000003,在usechain主链的创世区块中既已写入。

​ 委员会安装:

git clone https://github.com/usechain/go-committee.git

cd go-committee

make all

委员会组成

一共由5-11个节点构成。开始时由5个委员组成,随着治理结构完善逐渐补充,到9个,根据需要可能扩充到11个.

Usechain委员由线上选举产生。

委员不足时,Usechain基金会可以指定执行委员会代表,技术委员会代表等直接担任线上节点,后续全部改为选举。

委员会权益

委员会收益分为3部分。

  1. 固定收益
  2. 工作量收益
  3. 激励收益

固定收益

委员会拥有年USE通胀权益的百分比收益。

工作量收益

委员会拥有裁决手续费收益。初始阶段委员会无工作量收益。

正式运行一段时间后,收费预计如下: 委员会受理裁决手续费为总金额10%或100美金的较大值。 提起裁决必须抵押等值诉求金额,最低100美元等值USE。 提起裁决在抵押后可以立即锁仓被裁决对象等值金额。 其他账号丢失处理等手续费100美元起。

这个数值可能会根据后续需要及社区投票进行调整。

激励收益

维护社区,生态等所得收益,根据运营情况规划。

竞选委员会

锁仓前20%的用户拥有委员会竞选资格,具有最低USE门槛。锁仓期和任期相同,为1年。

如委员会合格候选人不足5人,则基金会可以指定委员来完成链上事务。

锁仓还可以通过社区建设助力,支持某委员的人可以协同锁仓,以增加该委员竞选力量。

任期:1年

身份登记:3星以上。

矿工和身份登记具有基础身份认证以上成员具有选举委员会权利。

委员会配置

开启主链节点

主链节点为used客户端,是委员会需要连接到主链的一个节点,委员会成员启动

配置监听主链节点文件(used.json)

{"Name":"Usechain Client .001","Url":"http://127.0.0.1:8848"}

Url为测试链IP 192.168.1.3和rpc端口8848

配置委员会合约(managerContract.json)

{
  "Name": "Committee Contract",
  "Description": "Committee storage, vote & management contract",
  "Address": "0xfffffffffffffffffffffffffffffffff0000003",
  "AbiStr": "[{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getCommittee\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"whichRound\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCommitteeIndex\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getCommitteeAsymkey\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"IsCommittee\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isEntireConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"Requirement\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCommitteePubkey\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidateLen\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rounds\",\"outputs\":[{\"name\":\"selected\",\"type\":\"bool\"},{\"name\":\"committeePublicKey\",\"type\":\"string\"},{\"name\":\"committeePublicKey_candidate\",\"type\":\"string\"},{\"name\":\"confirmCount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_pubkey\",\"type\":\"string\"}],\"name\":\"confirmCommitteePubkey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_COMMITTEEMAN_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_pubkey\",\"type\":\"string\"}],\"name\":\"uploadCommitteePubkey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCommitteeConfirmStat\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_flag\",\"type\":\"bool\"}],\"name\":\"controlVote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"vote_enabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_asymPubkey\",\"type\":\"string\"}],\"name\":\"confirmAndKeyUpload\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"Election_duration\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"calculateVotes\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"Election_cycle\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
}

Address为委员会合约地址,AbiStr为委员会合约ABI

配置委员会节点(committee.json)

{"CommitteeID":2,"Role":"Sharer","Address":"0x69d6569102e173350C23cf6fA64bd51A7420703A","PrivShares":""}

CommitteeID为从委员会合约投票选举出的委员会ID,无需填值

Role为Sharer,表示携带委员会密钥份额

Address为委员会地址

PrivShares为委员会门限密钥,无需填值

配置whisper节点(whisper.json)

{"NodeID":"","Boot":"enode://68f6b76efda0183816a642718837d8ca20d6e8a1a9dcef45bece889864995304b6bbcb9b92787b4e3ce5a2bf08434977f3e4bb809a372a436b0da88cd5820f70@[119.23.41.121]:30379","Topic":"a6fcb30d","Key":"f35c37f2a085001ec9b8a895f68e36759304f36f890bcdd52502267ef4eede55"}

此文件为委员会使用whisper通信的配置文件,文件不可更改

发送委员会成员初始化交易

usechain主链前1000个块不包含检查点区块,所以需要在前1000个块内完成委员会初始化(1000个块之后,初始化函数接口失效),所以在1000个区块前需要选出第一批委员会,第一批委员会可以先内定以保证主链正常出块。

eth.sendTransaction({from:eth.accounts[0], to:"0xfffffffffffffffffffffffffffffffff0000003", gas:3000000, data:"0xbd78f91400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000a414f648803fc0c8ac67272a19853a9ed6cafb1200000000000000000000000075c752ea23194a2fa72beeba1ae6c046982e47900000000000000000000000003325974a746e33781f5fa4ee11baec631f87e83800000000000000000000000069d6569102e173350c23cf6fa64bd51a7420703a0000000000000000000000009c1389e35069dcaed334124933208c1974c12e9c"})

发送代币给委员会

五个委员会在相互通信并生成门限蜜月后需要向合约发送密钥份额公钥(代码执行),此时委员会要保证自己的地址有USE。

eth.sendTransaction({from:eth.accounts[0], to:"0xa414f648803fc0c8ac67272a19853a9ed6cafb12", gas:3000000, value:15000000000000000000})
eth.sendTransaction({from:eth.accounts[0], to:"0x75c752ea23194a2fa72beeba1ae6c046982e4790", gas:3000000, value:15000000000000000000})
eth.sendTransaction({from:eth.accounts[0], to:"0x3325974a746e33781f5fa4ee11baec631f87e838", gas:3000000, value:15000000000000000000})
eth.sendTransaction({from:eth.accounts[0], to:"0x69d6569102e173350c23cf6fa64bd51a7420703a", gas:3000000, value:15000000000000000000})
eth.sendTransaction({from:eth.accounts[0], to:"0x9c1389e35069dcaed334124933208c1974c12e9c", gas:3000000, value:15000000000000000000})

委员会启动

./build/bin/committee

输入委员会keystore密码解锁,例如:
committee.unlock 123456

委员会节点启动后会获取合约里的投票结果,查询自己是否已经成为委员,成为委员后会自动相互发起和接收门限密钥消息,并生成自己的密钥份额保存在本地。然后开始扫描身份验证合约并验证。

身份认证交易

用户首先通过命令行入个人信息

./build/bin/used verify

按照提示顺序输入身份信息,目前证件类型仅支持身份证

其中身份字段设置参考:https://note.youdao.com/ynoteshare1/index.html?id=49f9b99b3092f083542b6664944f71b6&type=note#/

提交认证信息到 CA 服务器

个人信息文件将会存储在 ~/.usechain/ 目录下,需要手动将其覆盖该目录下的 userData.json

./build/bin/used verify --info=userData.json --photo="use.jpg;use2.jpg"

目前 userData.json 是写死的,无法使用自定义文件,photo 是认证的照片

向服务端申请证书,返回idKey

用户下载证书

./build/bin/used verify --query=idKey

注册身份

use.sendCreditRegisterTransaction({from:use.accounts[0],to:"0xfffffffffffffffffffffffffffffffff0000001",gas:'0x332423'})

其中0xfffffffffffffffffffffffffffffffff0000001为身份认证合约地址,eth.accounts[0]为用户需要认证的地址

用户的证书和userData需放到家目录的.usechain下。

委员会投票交易

投票是后续对新产生的委员的投票选举

eth.sendTransaction({from:eth.accounts[0],to:"0xfffffffffffffffffffffffffffffffff0000003",gas:"3000000",data:"0x6dd7d8ea000000000000000000000000a414f648803fc0c8ac67272a19853a9ed6cafb12"})

eth.sendTransaction({from:eth.accounts[1],to:"0xfffffffffffffffffffffffffffffffff0000003",gas:"3000000",data:"0x6dd7d8ea00000000000000000000000075c752ea23194a2fa72beeba1ae6c046982e4790"})

eth.sendTransaction({from:eth.accounts[2],to:"0xfffffffffffffffffffffffffffffffff0000003",gas:"3000000",data:"0x6dd7d8ea0000000000000000000000003325974a746e33781f5fa4ee11baec631f87e838"})

eth.sendTransaction({from:eth.accounts[3],to:"0xfffffffffffffffffffffffffffffffff0000003",gas:"3000000",data:"0x6dd7d8ea00000000000000000000000069d6569102e173350c23cf6fa64bd51a7420703a"})

eth.sendTransaction({from:eth.accounts[4],to:"0xfffffffffffffffffffffffffffffffff0000003",gas:"3000000",data:"0x6dd7d8ea0000000000000000000000009c1389e35069dcaed334124933208c1974c12e9c"})

查看投票结果

eth.call({from:eth.accounts[0], to:"0xfffffffffffffffffffffffffffffffff0000003",data:"0x35b8e8200000000000000000000000000000000000000000000000000000000000000000"})
eth.call({from:eth.accounts[0], to:"0xfffffffffffffffffffffffffffffffff0000003",data:"0x35b8e8200000000000000000000000000000000000000000000000000000000000000001"})

停止投票

eth.sendTransaction({from:eth.accounts[0],to:"0xfffffffffffffffffffffffffffffffff0000003",data:"0xc399d66f0000000000000000000000000000000000000000000000000000000000000000"})

委员会技术原理

委员会总账户密钥生成算法

委员会验证账户认证

用户认证发送交易包含用户加密信息data,假设用户公私钥对为 (a, A), 委员会公钥为B, 用户加密自己信息:

encryptedData = encrypte([hash(aB)]G, data)

由于:

[hash(aB)]G = [hash(bA)]G

每个委员会使用不同的份额拼凑hash(bA),还原加密公钥后解密用户信息,并进行认证