1

由于链码必须是确定性的,有没有办法在所有背书节点中获得相同的随机数来实现类似彩票的东西?在以太坊中,你可以这样做:

  function random() private view returns (uint) {
    return uint(keccak256(abi.encodePacked(block.difficulty, now, players)));
  }

通过使用区块编号、时间戳、区块难度、gas 等……但您在 Hyperledger Fabric 中没有这些。

4

2 回答 2

1

您非常正确,链码的确定性确实会导致随机数出现问题。

我会考虑以两种方式之一来做到这一点。

  1. 您需要传入随机数(或至少一个种子)作为交易请求的一部分。您可能希望以瞬态数据的形式发送它,这样它就不会记录在分类帐上。
  2. 预先存储随机数。即生成一个庞大的随机数表,并以某种形式的设置交易将它们放入分类帐中。甚至可能进入私人数据集合。每次您需要使用计数器的数字时,请按照这些操作。

您可以通过各种类型的访问控制来保护对生成的号码集的访问。

于 2020-12-01T10:05:54.597 回答
1

我们可以使用交易提议者传递的时间戳作为种子。用法: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)
于 2020-12-09T17:44:23.313 回答