由于链码必须是确定性的,有没有办法在所有背书节点中获得相同的随机数来实现类似彩票的东西?在以太坊中,你可以这样做:
function random() private view returns (uint) {
return uint(keccak256(abi.encodePacked(block.difficulty, now, players)));
}
通过使用区块编号、时间戳、区块难度、gas 等……但您在 Hyperledger Fabric 中没有这些。
由于链码必须是确定性的,有没有办法在所有背书节点中获得相同的随机数来实现类似彩票的东西?在以太坊中,你可以这样做:
function random() private view returns (uint) {
return uint(keccak256(abi.encodePacked(block.difficulty, now, players)));
}
通过使用区块编号、时间戳、区块难度、gas 等……但您在 Hyperledger Fabric 中没有这些。
您非常正确,链码的确定性确实会导致随机数出现问题。
我会考虑以两种方式之一来做到这一点。
您可以通过各种类型的访问控制来保护对生成的号码集的访问。
我们可以使用交易提议者传递的时间戳作为种子。用法:stub.GetTxTimestamp()
// GetTxTimestamp returns the timestamp when the transaction was created. This
// is taken from the transaction ChannelHeader, therefore it will indicate the
// client's timestamp and will have the same value across all endorsers.
GetTxTimestamp() (*timestamp.Timestamp, error)