Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
RandDrop 应用链% N% K& H) ]- k3 ]
RandDrop 应用链是指采用 BLS 签名,支持多合约部署的 MOAC 应用链。 RandDrop 目前还在测试阶段,将会支持两种原子跨链交换,完成母链原生通证或者 ERC20 通证和应用链原生通证之间的互换。7 f. o, a* k# |# K# N( P0 ?+ z9 C- v
RandDrop 共识
+ V8 p5 l* i  x& v% C% y8 T0 f" c共识算法作为区块链系统的核心技术,决定了整个系统的性能和可扩展性,一直是当前区块链关键技术研究的重点。 目前最新的共识机制研究中有很多对于 PoS 和 PBFT 的改进,尤其是使用随机数算法来提高共识的效率和增加参与共识的节点数目。5 \7 o- Q8 x* `
RandDrop 采用 BLS 签名,从共识层支持多个节点的签名片段进行合并得到阈值签名,以此为基础产生随机数。随机数可以在 RandDrop 的智能合约里面直接调用。RandDrop 随机数的优点是可以杜绝单个节点对最终签名的可操作性,更加安全可靠。同时,RandDrop 的信息量是 O(n),比其他类似的随机数区块链具有较大的优势。' W' O- Q6 w. [+ U5 Q* |# Y
RandDrop 应用链的验证过程由支持 RandDrop 应用链的客户端(SCS)完成,ProcWind 和 RandDrop 的 SCS 节点不能混用。* q' Z- H# h1 t
应用链本身是以智能合约的方式部署到 MOAC 平台上,其共识方式、节点组成和业务逻辑都在应用链合约中定义。
" {) [# M) _1 e  B& I' U/ X应用链节点控制合约(ScsProtocolBase),用于定义 SCS 节点共识方式和如何包括 SCS 节点矿工加入应用链;% ~! F0 l" m+ `4 [
可验证秘密共享(VssBase)合约,构造函数需要提供 1个 threshold 参数,该参数表示阈值签名的阈值。部署后,记录下 vssbase 合约的部署地址 vssbaseAddress;% t. R$ W$ N0 E1 F, i
应用链逻辑控制合约(AppChainBase):用于应用链控制逻辑,应用链生成前和生成后的一系列控制逻辑;
& h$ {5 ~; T3 c0 W& Y* z应用链合约控制(DappBase):用于控制合约在应用链上的部署,一条应用链可以部署多个合约;目前有两类控制合约,一类是仅允许应用链的部署帐号,即拥有者(owner)在应用链上部署合约,而另一类则没有这个限制;
/ \" {) t& R# y. f应用链 DAPP 智能合约:用于部署应用链业务逻辑的合约,每个应用链可以部署多个 DAPP 合约;
' h# j+ I) \- ?与 ProcWind 不同的是,在部署完 VssBase 和 RandDropChainBase 的合约后,需要在基础链上,调用 VssBase 合约的 setCaller 方法, 传入之前的 RandDrop 合约地址 subchainbaseAddress。 此方法调用后,保证了 VssBase 合约的部分关键函数只能由 subchainbase 合约调用,而无法由外部普通账户调用。% D: n5 Z0 S6 j7 N% j) b" \  }
RandDrop 中随机数的使用
0 o6 b8 x( m: ^5 z) SRandDrop 应用链可以产生随机数。随机数可以在 RandDrop 的智能合约里面直接调用。
9 E+ R) c5 Z) M3 e6 V4 |* Q+ Upragma solidity ^0.4.8;
) B) l! @2 s! I4 Y" Wcontract precompileBLS {
" {& O# h4 W% f: k  Ufunction f() public returns(bytes32);
* t+ S2 O# E5 k+ O" V0 {/ d}* N# y$ b8 Z- [) q- g; k
contract Lottery {, z: J, x/ ~. u
mapping (uint8 => address[]) playersByNumber ;, h6 D: x5 T$ G+ l9 b
address owner;3 B# n7 p8 _! g6 K; G& s3 N# m! \% U
enum LotteryState { Accepting, Finished }
$ {2 X+ Z# l5 t& Z5 hLotteryState state;
2 s' Q* U8 I1 z: l" ]+ Tfunction Lottery() public {
. V( X' X8 I. N) s" B- Jowner = msg.sender;
" g3 v/ S3 W# p, h4 rstate = LotteryState.Accepting;! S4 |, T) @9 w
}
0 O( @# S$ R+ K2 }' j% Dfunction enter(uint8 number) public payable {
% ?0 z3 t: L+ d# I) K/ |require(number
  F  q; O# u+ {6 l' f9 j9 Wfunction determineWinner() public {$ C* a$ _3 b: `2 S8 F# k
require(msg.sender == owner);) r% q' E& M' w, d8 z. P
state = LotteryState.Finished;; o; x: O2 f) a. E
uint8 winningNumber = random();5 T& H, |2 ]) l. F) \( ]0 l
distributeFunds(winningNumber);
7 C7 W& G5 Q: A}0 H$ h& ~% k" Q" N* G
function resetLotteryState() public {
. [2 f( M# n6 ~: O6 erequire(msg.sender == owner);
' h! y/ {& a9 c- g, Gstate = LotteryState.Accepting;) D+ F# {( u: Y1 K+ V6 y
}+ e: v' s3 D- g! J
function distributeFunds(uint8 winningNumber) private returns(uint256) {
1 K: }1 O7 i+ A8 a9 A- duint256 winnerCount = playersByNumber[winningNumber].length;
) |' B  F4 T# C( N+ _: Quint256 balanceToDistribute = this.balance/(2*winnerCount);
) w& ?' _' d* W. b+ P! z# ]1 Mfor (uint i = 0; i9 Q$ ]4 x# J; T0 V" s7 N
return this.balance;4 A4 ^  Y1 J0 A3 t% n( I2 j7 x
}
3 ]4 b% F- @6 L+ J. Ofunction random() private view returns (uint8) {
. }. ?, E6 [$ I% @) qprecompileBLS bls = precompileBLS(0x20);$ _+ t: f' `" t0 t9 m
// get the 256-bit random number. m: M" c0 K) F- [
bytes32 r = bls.f();8 z. ]8 `5 r1 {% R( n6 N. }. d, ?
// return its first 8 bits, range from 0-255
# [) T5 Q- s# oreturn uint8(r[0]);
+ a7 a7 T$ y; z+ M7 o# r' `}
) C! ^/ V' h8 ?: j( d) y}
3 T, O/ j) f2 P4 iRandDrop 验证节点* d! N( X- O2 C+ L& M" N
RandDrop 节点客户端与 ProcWind 不同,称智能合约服务器 Smart Contract Server(SCS-VSS) 是支持 BLS 共识的节点软件。 SCS-VSS 也通过 VNODE 代理节点接入 MOAC 母链,每个运行的 SCS 可以支持多条应用链,也可以动态接入不同 VNODE。 目前有两种应用链客户端,分别支持对应的应用链 ProcWind 和 RandDrop。2 ~$ {/ s4 u% D! x  ^
当前,按在应用链中的功能分,有如下几种 SCS 节点类型:
3 B/ c& p" b9 g: W* Z参与业务逻辑的 SCS
8 t6 R  g! E8 s$ V! E, {+ e用于业务监控的 SCS
8 z+ }; r) U6 v/ X' v& B准备参与业务逻辑的 SCS
7 \5 D* o1 O7 R( U节点的操作可以参考:
% F/ _$ J  \/ _3 d- M9 eSCS 节点快速启动指南% M/ l  m' a" ?" h
RandDrop 通证0 H' |; C% k( ?) e4 w- d$ T
RandDrop 应用链也支持应用链上的原生通证(TOKEN),其发行方式是在应用链合约中设定,这点和 ProcWind 相同, 详细介绍请参考: RandDrop 应用链的部署. h: Z4 u/ m2 ~$ \8 L
关于 RandDrop 上通证的转移,也是采用 shardingFlag=2 的方式,例子如下:
6 c4 y5 J  ?4 X( [, }5 P//Example to transfer the AppChain tokens" _& A" ~# V* V
function sendAppChainToken(baseaddr,basepsd,appchainaddr,amount,code,sf,n)
8 s. ^8 a$ Y; ?6 R{! _' I. R+ r" m) J9 n5 }& H8 h
//unlock the
! C2 A; k5 y/ o3 v/ jchain3.personal.unlockAccount(baseaddr,basepsd,0);* B2 g( ?1 k5 n# o1 T! ^4 X
//transfer the appchain token
" }( u! i* ]" u" P: d( E# p! M$ ichain3.mc.sendTransaction(/ o% [& N  c. c) w# E
{' ~; c3 V( _$ {9 q7 I+ O: e
from: baseaddr,5 n& i4 \; ~/ h. q, \
value:chain3.toSha(amount,‘mc’), // note this value is the appchain token value, not mc3 N; \; e# x# S. U' j
to: appchainaddr,
! N/ W* N' v2 N4 v- P8 ]; tgas: ‘0’,//‘200000’,
( L) u4 N. T5 m" e; E3 b; @: ngasPrice: ‘0’,//chain3.mc.gasPrice,
1 a4 X7 f  S' O1 VShardingFlag: sf," I6 G3 M, m/ Y
data: code,
* |9 Q! |' h! H! W2 M- v9 Jnonce: n,
7 F1 P% ^! {+ x! y. Kvia:via,
9 d/ c2 e) E! B9 w9 f});- f& R9 I: p; U* A* J1 ?  i/ V
console.log('sending from:' + baseaddr + ' to:' + appchainaddr  + ' with nonce:' + n);
( j" m7 b. K4 M, F, d- `}
/ d8 b5 I5 Q7 k5 g// Call the function to transafer3 ~; r( ^# B/ {5 E) G1 k" u; L& _
var amount = 1;
+ w1 z6 q; [# `( |//函数输入参数说明
; l/ `2 I( \5 r/ U) q//baseaddr:转出地址
' q: j5 T/ k, Y# ~//basepsd:转出地址的密码
% k" v( R6 X* g/ m//appchainaddr:应用链地址
# i9 X$ K2 q) U. l! c" h2 G//amount:转账金额
& q. a2 r0 p0 D% n+ Z% N//receive: 转入的地址
' a1 f- \- ~" {9 h) W0 ^//‘0x2’: shardingFlag 设为2为应用链原生货币转换
* }& U: }# R' x# j/ m//n: 转出地址的nonce
. f, l6 m) Y5 @0 hsendAppChainToken(baseaddr,basename,appchainaddr,amount,receive,‘0x2’,n)% q3 e( N4 A* k, G) A# I. J( l
RandDrop 跨链2 c3 r3 v3 s5 t) y1 J
应用链通证可以和母链的原生货币或者 ERC20 代币直接进行兑换,只需要部署不同的应用链合约并执行相应功能调用即可完成。 具有与母链原生货币(moac)进行跨链交换功能合约的名称为 ASM(Atomic Swap of Moac)。 具有与母链 ERC20 代币进行跨链交换功能合约的名称为 AST(Atomic Swap of Token)。 具体做法可以参考:! o1 [- ?0 R' o5 Y$ A
ProcWind 跨链指南; ?9 s- v0 ?7 J3 \8 r" {
RandDrop 应用链的参数和设置7 D3 N0 Q1 l' p6 W# g$ n, Y9 P
目前采用 RandDrop 共识的应用也分为两种:ASM 和 AST。 在 MOAC 发布的目录可以看到合约内容,主要的不同是需要加入 VssBase.sol 的部署地址。
4 Q9 D+ F) a  b1 G% TASM 的合约构建函数为:5 H) m0 o! v' U4 H! A
function ChainBaseASM(# \9 g* N' m8 K
address scsPoolAddr,+ A% b  x& q1 i6 w8 Q* G1 V
address vnodeProtocolBaseAddr,
0 |, l, N& f: B0 M! _: t  wuint min,; Q4 W, \0 W& E3 q+ D
uint max,4 L4 _# |1 e8 `  I# e- @* x
uint thousandth,' L  u) i' i7 t: ]! O$ p
uint flushRound,8 s1 j( n2 [6 K4 K
uint256 tokensupply,
1 |' ~, w5 Y! Z: r6 |% ouint256 exchangerate,
( p5 q: M& ?$ D. c3 W" @address vssBaseAddr5 i1 y+ {. ?$ A7 w
)
# g0 ~* m* c  m5 |其中的参数含义为:" k) L& M0 J& I% `& b
address scsPoolAddr - SCS 节点池地址;2 h1 Y  |6 O4 }& r9 J
address vnodeProtocolBaseAddr - Vnode 节点池合约地址;# K* H" |4 S, L
uint min - 应用链需要 SCS 的最小数量,需要从如下值中选择:1,3,5,7;& g4 v1 u) y0 F
uint max - 应用链需要 SCS 的最大数量,需要从如下值中选择:11,21,31,51,99
) A: W7 i. U( n3 y" j/ s9 ~0 Buint thousandth - 控制选择 scs 的概率,建议设为 1,对于大型应用链节点池才有效;* w4 [- @% C: g. t0 W
uint flushRound - 应用链刷新周期 单位是主链 block 生成对应数量的时间,当前的取值范围是 40-99;
, \" x8 ^) U: Y# _2 Iuint256 tokensupply - 应用链的原生货币数量;
) E0 C# y! N+ l. l3 duint256 exchangerate - 应用链原生货币和母链 moac 的兑换比例;2 ?* U/ @2 R9 q; ~9 K5 `
address vssBaseAddr - VSSBase 的部署地址;  Z6 K& s2 g% _' z. E& @  l
注意,这里输入参数 tokensupply 和应用链的 BALANCE 相对映, BALANCE = tokensupply * 1e18 例如,tokensupply = 1000,结果的 BALANCE 应该是 10 的 21 次方。6 W$ S' O# V4 Z& F* H. c& y
AST 的合约构建函数为:/ ?4 R$ {  j( ~# H
function ChainBaseAST(
9 N" i% r/ H* d* r  {9 Baddress scsPoolAddr,
' n1 |8 w8 Y8 paddress vnodeProtocolBaseAddr,- s# o0 H7 b6 d6 t3 T$ H
address ercAddr,
( Y& O8 V0 p2 E9 J* ^+ ]6 wuint ercRate,8 y- Y/ @  S# [2 T8 }# u
uint min,
5 |* j- J1 p( i) m) W0 d  huint max,: B# `0 ?# g7 V/ K
uint thousandth,6 m' N5 @/ g2 [6 k! z: I  y
uint flushRound,
3 K( r( L% Z2 |$ Z( Q. t1 |! D) I: Xuint256 exchangerate,( T7 {# P5 T7 E! l0 I; y3 p& C: K
address vssBaseAddr
5 [7 D' ~/ x; y7 ?* j: z' E8 l5 B, n. I)1 |# q9 g8 z# M
其中的参数含义为:
  l( T" c2 T2 Y4 naddress proto - SCS 节点池地址;) b- t* O" ^! r7 b+ z( s# h
address vnodeProtocolBaseAddr - Vnode 节点池合约地址;& v$ Q" w5 X  }7 [2 z% r6 C" V
address ercAddr - 基础链 ERC20 合约地址;
, \" C8 T: X2 t6 luint ercRate - 应用链原生货币和基础链 ERC20 token 的兑换比例;
- B% o. F% b7 A1 M2 wuint min - 应用链需要 SCS 的最小数量,需要从如下值中选择:1,3,5,7;
, o& v7 g1 b$ e0 g& k- buint max - 应用链需要 SCS 的最大数量,需要从如下值中选择:11,21,31,51,99
/ g- G# M$ N, ~: K! p' F, cuint thousandth - 控制选择 scs 的概率,建议设为 1,对于大型应用链节点池才有效;, f1 X; K7 N# P* s$ ^  J1 C
uint flushRound - 应用链刷新周期 单位是主链 block 生成对应数量的时间,当前的取值范围是 40-99;
9 Q0 z/ r2 P. H2 i8 C0 {uint256 exchangerate - 应用链原生货币和母链 moac 的兑换比例;& ^9 `" X- p! o  u5 }# U, p9 t
address vssBaseAddr - VSSBase 的部署地址;
/ x% c' T4 Z3 L/ E& J% g注意,AST 应用链的 BALANCE 不能设定,而是由 ERC20 token 里面 totalSupply 所决定的, BALANCE = tokenSupply * ERCRate * (10 ** (ERCDecimals));
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14