区块链 · 2018年12月13日 0

HPB 芯链

BOE 硬件

高性能区块链的革命性技术——区块链卸载引擎(BOE),让我们在现实世界中广泛应用区块链技术更进一步。硬件和软件的独特组合降低了技术与资源的门槛,所有来自不同背景的开发人员——无论他们是来自大型跨国公司还是小型初创企业——都可以参与到HPB的生态系统。BOE的硬件与软件协同工作,也改善了传统系统中存在的问题。

设计

  • HPB节点系统利用专用的高规格服务器和BOE硬件单元,这些芯片组的设计目的是加快处理交易的速度。我们的定制板包括下列模块和芯片:
  • MAC模块: 处理从以太网电缆传输的数据包。
  • 硬件随机数发生器: 生成随机数字以保护交易,提高加密通道的安全性和可靠性。
  • TCP/IP卸载引擎(TOE): 高速优化以太网系统的生产力。
  • 椭圆曲线数字签名算法(ECDSA)模块: 执行高速签名验证过程。该模块对于创建每秒能有数以千计的电子签名系统至关重要。

功能

  • 加密的通信通道是通过TCP/IP卸载引擎(TOE)模块建立的。该模块执行完整性检查与签名验证,并对帐户余额的消息、交易信息、块进行检查。对于过多的块状数据,它会执行片段处理并封装每个片段,确保数据接收的完整性。
  • 收集每个TCP连接的接收流量的统计信息。通过HPB独特的并发算法,BOE能够为系统的贡献提供相应的激励,从而激励用户维护网络的运行。
  • 椭圆曲线数字签名(ECDSA)算法的任务是减少签名验证时间,极大地提高了性能。
  • 通过这三个功能领域,BOE系统可以同时访问10000个TCP会话。这使会话反应时间与传统节点相比减少x100

节点

按节点作用可以分为启动节点、高性能节点、候选节点、同步节点。

启动节点

启动节点(bootnode)是用于网络节点发现的中介节点。每个启动节点同样有hnode唯一标识,这个标识将在HPB代码中固定,其他类型节点启动时需要连接公共节点才可以接入整个网络,启动节点不具有区块生成权利。

高性能节点

高性能节点(High Performance Node)用于形成共识,产生区块数据。

  • 高性能节点之间的连接形式应该确保为全连接。
  • 高性能节点产生的区块数据要分片,并优先同步给其他高性能节点,再同步给候选节点。
  • 高性能节点收到区块的分片数据后,要优先广播的其他高性能节点,并在接收到分片数据后,组装成完整区块数据写入链中。

目前HPB主网规定高性能节点数量为31个,从151个候选节点中选出,高性能选举后剩余121个候选节点。

候选节点

候选节点(Candidate Node)用于转发数据。候选节点汇聚同步节点的交易数据,转发给高性能节点以便把交易数据写入区块。候选节点也会同步高性能节点的区块数据,并把区块数据广播到其他候选节点。

目前HPB主网规定候选节点数量为151个(高性能选举前),从有BOE板卡的节点中选出。

同步节点

同步节点(Synchronization Node)数量不限,只用于区块同步。

目前HPB主网有五个启动节点,HPB测试网有一个启动节点,均由HPB芯链持有并进行日常维护。

节点的发现

在P2P网络中,要发现并连接其他节点,常见的是通过种子节点连接到网络,然后通过种子节点获取其他节点的地址。再HPB中及启动节点(bootnode)。在/go-hpb/config/networkconfig.go中定义:

var MainnetBootnodes = []string{
    "hnode://73c8ac9dddc8f094d28f42e1ec5c3e8000cad25be152c147fceacc27953d58e64bfe9f555145d93f9f6b995bab984411941751fef3bd460f74c0151eb0432b56@47.94.20.30:30303",
    "hnode://1c129009d0e9c56e79b6f4157497d8ac2810ea83fc1f6ed4b6244406597d821f52bb0d210157854d861d2f6099fa948bc5a03d2f4f1bcae70dc6e9c535e586f9@47.100.250.120:30303",
    "hnode://f3282847f29cfea1dd741246cc17b9a0dcdd8b0b9dfce2a985d2358497458135e81942ae7155cfd2fe23e1da30f18fc1fa2c56d3675aba51e7c67f83681fded5@47.75.213.166:30303",
    "hnode://dd2fd6ea314041c0e20aed4ee4159ab172a4ddb944459d147bdb28461937841ee069c44fe0915be9f74d929562968fb9720362937a898e2ec3a598fa3fe1f33b@47.88.60.227:30303",
    "hnode://a6ef92a46adb69f94f2d48ff20f7800fb057d6aba7945e5af062ef27be5598072c5ce083ec5a2c89f80d112401c261b9ba9dacbd53aeb7c8243685d537edadb9@47.254.133.46:30303",
}

这里代码中公网的5个种子节点,任何节点都需要经过种子节点发现其他存活的节点。

共识算法

为了适应BOE技术的要求,同时尽可能的提升安全TPS1,HPB共识算法采用了高效的双层选举机制,即外层选举和内层选举。

  • 外层选举:采用节点贡献值评价指标,从众多候选节点中选出高贡献值节点成员。
  • 内层选举:基于 Hash 队列匿名投票机制,在每次区块生成时,计算高贡献值节点生成区块的优先级,优先级高的高贡献值节点享有优先生成区块的权利。

在整个共识算法设计中,HPB共识算法的轻量级消息交换机制使其在共识效率上远高于其他共识算法, 同时在安全性,隐私性等方面也做了较大幅度的提升。

外层选举

外层选举阶段用来从众多候选节点中选举出高贡献值节点。为尽可能减少网络同步和充分利用链上各个节点的数据,采用了创新的自适应一致性选举方案,即用「账本」一致性保证外层选举的一致性的方案。

将各个评价指标内置到区块中,在过往账本一致性的前提条件下,各个高贡献值节点可以自适应的计算出当前所有参与候选的节点的排名,排名较高候选节点会在下一轮正式成为高贡献值节点。

候选节点贡献价值评价指标包括如下因素:

  • BOE 硬件引擎:是否配置有 BOE 加速引擎
  • 网络带宽贡献:固定历史周期内的数据吞吐量
  • 信誉度评估:通过对打包区块及交易转发等交易参与行为及数据分析评估节点信誉度值
  • 节点令牌总持有时间:根据账户信息实时统计

内层选举

按照HPB共识算法的设计,内层选举建立在高贡献值节点的基础上,目标是高效的找出每个区块所对应的高贡献值节点,可分为三个阶段:提名阶段、统计阶段、计算阶段。

  • 提名阶段:每一个投票周期开始时,BOE加速引擎生成随机性commit,每个高贡献值节点提交该Commit,即Commit随着高性能节点生成的区块最终同步到链中。
  • 统计阶段:每一个投票周期结束时,高贡献值节点统计出区块链中的Commit,并创建投票池:(Commit1, Commit2, Commit3, Commit4, … Commitn)
  • 计算阶段:生成区块时,每一个高贡献值节点,将投票池中的Commit按照固定的权重算法迅速计算出本节点在该区块的生成优先级。生成优先级最高的高贡献值节点,将获得区块打包权利。其他节点按照可验证随机函数(VRF)的原则,在收到的区块入链时对随机数和地址的签名进行校验,既保障了可靠性又保证了高贡献值节点的不可预测性和地址隐私性。

HPB共识算法方案在提供了严格的隐私性的同时(在区块未进行打包前,当前节点无法预测生成下个区块的节点), 还兼顾到了高贡献值节点的安全性校验

Gas机制

在HPB网络中,Gas费用在涉及普通交易和智能合约交易时并不相同,通常来说HPB普通交易的默认Gas Units = 10。Gas price 根据HPB所有节点的竞争而变化,通常的经验值为 Gas Price = 18Gwei。

Gas = Gas Units * Gas price

/go-hpb/common/constant/protocol_params.go中定义了不同操作所需的Gas Units:


const ( MaximumExtraDataSize uint64 = 32 // Maximum size extra data may be after Genesis. ExpByteGas uint64 = 10 // Times ceil(log256(exponent)) for the EXP instruction. SloadGas uint64 = 50 // Multiplied by the number of 32-byte words that are copied (round up) for any *COPY operation and added. CallValueTransferGas uint64 = 9000 // Paid for CALL when the value transfer is non-zero. CallNewAccountGas uint64 = 25000 // Paid for CALL when the destination address didn't exist prior. TxGas uint64 = 10 // Per transaction not creating a contract. NOTE: Not payable on data of calls between transactions. //for testnet TxGasContractCreation uint64 = 53000 // Per transaction that creates a contract. NOTE: Not payable on data of calls between transactions. TxDataZeroGas uint64 = 1 // Per byte of data attached to a transaction that equals zero. NOTE: Not payable on data of calls between transactions. //for testnet QuadCoeffDiv uint64 = 512 // Divisor for the quadratic particle of the memory cost equation. SstoreSetGas uint64 = 20000 // Once per SLOAD operation. LogDataGas uint64 = 8 // Per byte in a LOG* operation's data. CallStipend uint64 = 2300 // Free gas given at beginning of call. Sha3Gas uint64 = 30 // Once per SHA3 operation. Sha3WordGas uint64 = 6 // Once per word of the SHA3 operation's data. SstoreResetGas uint64 = 5000 // Once per SSTORE operation if the zeroness changes from zero. SstoreClearGas uint64 = 5000 // Once per SSTORE operation if the zeroness doesn't change. SstoreRefundGas uint64 = 15000 // Once per SSTORE operation if the zeroness changes to zero. JumpdestGas uint64 = 1 // Refunded gas, once per SSTORE operation if the zeroness changes to zero. EpochDuration uint64 = 30000 // Duration between proof-of-work epochs. CallGas uint64 = 40 // Once per CALL operation & message call transaction. CreateDataGas uint64 = 200 // CallCreateDepth uint64 = 1024 // Maximum depth of call/create stack. ExpGas uint64 = 10 // Once per EXP instruction LogGas uint64 = 375 // Per LOG* operation. CopyGas uint64 = 3 // StackLimit uint64 = 1024 // Maximum size of VM stack allowed. TierStepGas uint64 = 0 // Once per operation, for a selection of them. LogTopicGas uint64 = 375 // Multiplied by the * of the LOG*, per LOG transaction. e.g. LOG0 incurs 0 * c_txLogTopicGas, LOG4 incurs 4 * c_txLogTopicGas. CreateGas uint64 = 32000 // Once per CREATE operation & contract-creation transaction. SuicideRefundGas uint64 = 24000 // Refunded following a suicide operation. MemoryGas uint64 = 3 // Times the address of the (highest referenced byte in memory + 1). NOTE: referencing happens on read, write and in instructions such as RETURN and CALL. TxDataNonZeroGas uint64 = 1 // Per byte of data attached to a transaction that is not equal to zero. NOTE: Not payable on data of calls between transactions. //for testnet MaxCodeSize = 24576 // Maximum bytecode to permit for a contract // Precompiled contract gas prices EcrecoverGas uint64 = 3000 // Elliptic curve sender recovery gas price Sha256BaseGas uint64 = 60 // Base price for a SHA256 operation Sha256PerWordGas uint64 = 12 // Per-word price for a SHA256 operation Ripemd160BaseGas uint64 = 600 // Base price for a RIPEMD160 operation Ripemd160PerWordGas uint64 = 120 // Per-word price for a RIPEMD160 operation IdentityBaseGas uint64 = 15 // Base price for a data copy operation IdentityPerWordGas uint64 = 3 // Per-work price for a data copy operation ModExpQuadCoeffDiv uint64 = 20 // Divisor for the quadratic particle of the big int modular exponentiation Bn256AddGas uint64 = 500 // Gas needed for an elliptic curve addition Bn256ScalarMulGas uint64 = 40000 // Gas needed for an elliptic curve scalar multiplication Bn256PairingBaseGas uint64 = 100000 // Base price for an elliptic curve pairing check Bn256PairingPerPointGas uint64 = 80000 // Per-point price for an elliptic curve pairing check )

【内容节选自(http://blockgeek.org)】






>>转载请注明原文链接地址:HPB 芯链