首页 > 世链号 > 在以太坊上如何实现联盟链
以链之名  

在以太坊上如何实现联盟链

摘要:搞了三个月联盟链,基本上算是告一段落,大概梳理下所做的东西,希望能对要做联盟链的人有所帮助。

在写这篇文章前,简单介绍下联盟链的功能。

  • 国密和国际算法切换

  • 参数 toml 配置

  • 有币无币

  • 支持 Gmssl

  • P2P 的证书准入

  • 委员会成员更新

  • Solc 编译器

  • Tendermint 共识

  • 权限准入

  • 交易校验

  • Rpc

  • 状态存储

  • 系统合约

加密算法

  • 国密和 S256,P256

支持国密 sm2,sm3,sm4, 国际的支持 p256,比特币以太坊都使用的 s256. 刚开始做的时候计算支持 p256 和国密,因为 go sdk 里面证书使用了 p256。后在做的过程中发现国外证书很多还需要支持 RSA,遂引入了 gmssl,委员会中的 PK 公钥和证书做了分离。

 * 统一的接口,外部调用同一签名验签方法 * 国密里面有个问题,无法 `recover 公钥 `,校验签名比较慢。 

Toml 文件配置

toml 文件的优点在于不需要在启动的时候指定一系列参数

  • 节点信息

    • 网络 ID 同步模式

    • 委员会私钥

    • IP 和端口

  • txpool

    • gas 门槛

    • txpool 账户数

  • 节点 rpc 端口 api

    • 存储目录

    • ipc websocket

    • 开放 api

    • rpc 端口

  • p2p 节点配置

    • 证书

    • 节点私钥

    • 节点连接数

    • 监听地址

创世区块

创世里面指定了 UseGas 指定有无币,KindOfCrypto 指定加密类型,PermisionWlSendTxPermisionWlCreateTx 是权限里面是白名单还说黑名单有效 ,Committee 指定了委员会的成员信息 ,CertList 指定证书列表。


return &Genesis;{    Config:       params.TestnetChainConfig,    UseGas:       1,    IsCoin:   1,    KindOfCrypto: 2,    PermisionWlSendTx:    1,    PermisionWlCreateTx:    1,    Timestamp:    1537891200,    Coinbase:     common.HexToAddress("0x0000000000000000000000000000000000000000"),    ParentHash:   common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"),    Alloc: map[common.Address]types.GenesisAccount{      common.HexToAddress("0x68231C69431Cd7592356aBaC59E7A9D325406653"): {Balance: amount1},    },    Committee: []*types.CommitteeMember{      {Coinbase: getAddressFromPub(seedkey1), Publickey: seedkey1},    },    CertList: certList,  }

有无币

当无币时 EstimateGas,SuggestPrice 评估 gaslimit 和 gas 的方法需要返回 0,tx_pool 中关于 gas 的判断和 evm 扣除 gas 的操作都要去掉。

GMSSL

这个模块主要做证书的生成,自认证,颁发证书,支持国密和 RSA。

P2P 证书的准入

节点启动的时候,委员会成员具有根证书,新接入的节点需要跟证书授权。

  • 节点发现中加入证书校验,校验通过发送邻居节点。

  • 在秘钥交换中也会校验证书,校验通过会建立连接。

  • 支持 tls,在开发中。

委员会成员更新

委员会成员的更新需要当届成员发起提案,当三分之二成员对同一个成员发起了 提案,则此成员在 下一届 会成为新的委员会成员。提案是通过 交易 达成的,在链上部署了一个证书 系统合约,所有的委员会只需发一笔交易,即可对一个成员的 删除 和 添加.

Solc 编译器

由于 abi 中 函数的签名 用通过 sha3 函数名+参数 得到的,所以如果你用以太坊提供的 solc 程序编译的合约,在链上是部署不成功的,这时需要用国密的 solc 编译器编译。

Tendermint 共识

众所周知,POW 的共识 TPS 很低,想提高 TPS,BFT 算法是很好的选择,tendermint 共识做的非常棒,能在 5s 内出块。

权限准入

这个恐怕是联盟链里面最复杂的场景了,花费了很长时间测试。主要有两个 基本功能

  • 发交易权限

  • 创建合约权限

这两大基本权限衍生出 管理员 和 普通成员。管理员可以授予新成员普通成员权限和管理员权限。

  • 组权限:如果想对一批人进行管理,这里引入了 组权限,即创建一个群组,将一成员加到组里面,如果想移除组里所有人的权限,可删除组。组里面也有 成员 和 管理员 权限。

  • 合约访问权限:自己的创建的合约,可设置谁可以访问,只有添加到访问列表里的成员才可访问合约,这里面也有 成员 和 管理员 权限。

权限是 系统合约 实现的 , 任何的权限控制都需要通过 交易 来完成,权限是 立即生效 的,这个和证书合约有所不同。
里面用到了 大量的 map,导致存储的时候需要实现 rlp 方法,对 map 进行 排序

交易校验

由于国密 recover 公钥没有现成的实现,在交易字段里面加入了 PK,这个和 SDK 联调的时候还是有一些问题,首先 hash 算法要匹配,计算出的 TxHash 要一样,RLP 数据 的顺序也需一致。校验签名通过之后,用 PK 计算 账户地址

RPC API

rpc 中加入了证书和权限的一些查询方法,通过修改 web3ext.go 完成的,inputDefaultBlockNumberFormatter 这个字段在 console 里面可以不需要输入,通过 json rpc 的时候则需要填写,例如 latest

状态存储

合约和权限都是系统合约,存储的方式与合约存储一致,在状态里面加了种类型,方便状态回退。

系统合约

系统合约类似预编译合约,功能比以太坊里面的预编译合约强大一些,可操作状态,系统合约里面 不可存时间,会造成状态不一致 , 系统合约 debug 比较烦,Receipt 里面 无 Error 字段,Dapp 很难查询合约 执行失败 原因。

来源链接:mp.weixin.qq.com
来源
科帆区块链

免责声明
世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。