在区块链上,由于一切信息都是透明公开的,提供一个安全实用的随机数是一个非常困难的问题。但是随机数是很多应用的基础,比如游戏,博彩,流程控制等。因此,提供一个实用可靠的随机数是基于智能合约的应用的迫切需求。
苗博士认为:我们日常创建账户,赌博游戏验证身份都需要用到随机数。
例如:EOS区块链上的博彩游戏,就是利用EOS的智能合约创造出来的。
只要是人为创造出来的随机数,都会被破解,也就是伪随机数。破解之后,黑客就可以把智能合约上的代币都拿走。
只有自然界通过物理的方式,创造出来的随机数,才是不可能破解,最安全的。 ———————————————————————————————————— 陈小虎认为:在区块链上,由于一切信息都是透明公开的,提供一个安全实用的随机数是一个非常困难的问题。但是随机数是很多应用的基础,比如游戏,博彩,流程控制等。 RandDrop应用链的部署及随机数的使用
————————————————————————————————————
RandDrop应用链是指采用BLS签名,支持多合约部署的MOAC应用链。 RandDrop目前还在测试阶段,将会支持两种原子跨链交换,完成母链原生通证或者ERC20通证和应用链原生通证之间的互换。
共识算法作为区块链系统的核心技术,决定了整个系统的性能和可扩展性,一直是当前区块链关键技术研究的重点。 目前最新的共识机制研究中有很多对于PoS和PBFT的改进,尤其是使用随机数算法来提高共识的效率和增加参与共识的节点数目。
RandDrop采用BLS签名,从共识层支持多个节点的签名片段进行合并得到阈值签名,以此为基础产生随机数。随机数可以在RandDrop的智能合约里面直接调用。RandDrop随机数的优点是可以杜绝单个节点对最终签名的可操作性,更加安全可靠。同时,RandDrop的信息量是O(n),比其他类似的随机数区块链具有较大的优势。
RandDrop应用链的验证过程由支持RandDrop应用链的客户端(SCS)完成,ProcWind和RandDrop的SCS节点不能混用。
应用链本身是以智能合约的方式部署到MOAC平台上,其共识方式、节点组成和业务逻辑都在应用链合约中定义。
与ProcWind不同的是,在部署完VssBase和RandDropChainBase的合约后,需要在基础链上,调用VssBase合约的setCaller方法, 传入之前的RandDrop合约地址 subchainbaseAddress。 此方法调用后,保证了VssBase合约的部分关键函数只能由subchainbase合约调用,而无法由外部普通账户调用。
RandDrop应用链可以产生随机数。随机数可以在RandDrop的智能合约里面直接调用。
pragma solidity ^0.4.8;
contract precompileBLS {
function f() public returns(bytes32);
}
contract Lottery {
mapping (uint8 => address[]) playersByNumber ;
address owner;
enum LotteryState { Accepting, Finished }
LotteryState state;
function Lottery() public {
owner = msg.sender;
state = LotteryState.Accepting;
}
function enter(uint8 number) public payable {
require(number<=255);
require(state == LotteryState.Accepting);
playersByNumber[number].push(msg.sender);
}
function determineWinner() public {
require(msg.sender == owner);
state = LotteryState.Finished;
uint8 winningNumber = random();
distributeFunds(winningNumber);
}
function resetLotteryState() public {
require(msg.sender == owner);
state = LotteryState.Accepting;
}
function distributeFunds(uint8 winningNumber) private returns(uint256) {
uint256 winnerCount = playersByNumber[winningNumber].length;
uint256 balanceToDistribute = this.balance/(2*winnerCount);
for (uint i = 0; i<winnerCount; i++) {
playersByNumber[winningNumber][i].transfer(balanceToDistribute);
}
return this.balance;
}
function random() private view returns (uint8) {
precompileBLS bls = precompileBLS(0x20);
// get the 256-bit random number
bytes32 r = bls.f();
// return its first 8 bits, range from 0-255
return uint8(r[0]);
}
}
RandDrop节点客户端与ProcWind不同,称智能合约服务器 Smart Contract Server(SCS-VSS) 是支持BLS共识的节点软件。 SCS-VSS也通过VNODE代理节点接入MOAC母链,每个运行的SCS可以支持多条应用链,也可以动态接入不同VNODE。 目前有两种应用链客户端,分别支持对应的应用链ProcWind和RandDrop。
当前,按在应用链中的功能分,有如下几种SCS节点类型:
节点的操作可以参考:
RandDrop 应用链也支持应用链上的原生通证(TOKEN),其发行方式是在应用链合约中设定,这点和ProcWind相同, 详细介绍请参考: RandDrop 应用链的部署
关于RandDrop上通证的转移,也是采用shardingFlag=2的方式,例子如下:
//Example to transfer the AppChain tokens
function sendAppChainToken(baseaddr,basepsd,appchainaddr,amount,code,sf,n)
{
//unlock the
chain3.personal.unlockAccount(baseaddr,basepsd,0);
//transfer the appchain token
chain3.mc.sendTransaction(
{
from: baseaddr,
value:chain3.toSha(amount,'mc'), // note this value is the appchain token value, not mc
to: appchainaddr,
gas: '0',//'200000',
gasPrice: '0',//chain3.mc.gasPrice,
ShardingFlag: sf,
data: code,
nonce: n,
via:via,
});
console.log('sending from:' + baseaddr + ' to:' + appchainaddr + ' with nonce:' + n);
}
// Call the function to transafer
var amount = 1;
//函数输入参数说明
//baseaddr:转出地址
//basepsd:转出地址的密码
//appchainaddr:应用链地址
//amount:转账金额
//receive: 转入的地址
//'0x2': shardingFlag 设为2为应用链原生货币转换
//n: 转出地址的nonce
sendAppChainToken(baseaddr,basename,appchainaddr,amount,receive,'0x2',n)
应用链通证可以和母链的原生货币或者ERC20代币直接进行兑换,只需要部署不同的应用链合约并执行相应功能调用即可完成。 具有与母链原生货币(moac)进行跨链交换功能合约的名称为ASM(Atomic Swap of Moac)。 具有与母链ERC20代币进行跨链交换功能合约的名称为AST(Atomic Swap of Token)。 具体做法可以参考:
目前采用RandDrop共识的应用也分为两种:ASM和AST。 在MOAC发布的目录可以看到合约内容,主要的不同是需要加入VssBase.sol的部署地址。
ASM的合约构建函数为:
function ChainBaseASM(
address scsPoolAddr,
address vnodeProtocolBaseAddr,
uint min,
uint max,
uint thousandth,
uint flushRound,
uint256 tokensupply,
uint256 exchangerate,
address vssBaseAddr
)
其中的参数含义为:
注意,这里输入参数tokensupply和应用链的BALANCE相对映, BALANCE = tokensupply * 1e18 例如,tokensupply = 1000,结果的BALANCE应该是10的21次方。
AST的合约构建函数为:
function ChainBaseAST(
address scsPoolAddr,
address vnodeProtocolBaseAddr,
address ercAddr,
uint ercRate,
uint min,
uint max,
uint thousandth,
uint flushRound,
uint256 exchangerate,
address vssBaseAddr
)
其中的参数含义为:
注意,AST应用链的BALANCE不能设定,而是由ERC20 token里面totalSupply所决定的, BALANCE = tokenSupply ERCRate (10 ** (ERCDecimals));
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!