主页 > imtoken手机版下载 > 以太坊solidity_Solidity陷阱:以太坊的随机数生成

以太坊solidity_Solidity陷阱:以太坊的随机数生成

imtoken手机版下载 2023-04-17 08:04:31

以太坊坚固性

本文是与 iOlite 合作创建的。 感谢您支持使 SitePoint 成为可能的合作伙伴。

本文是与 iOlite 合作创建的。 感谢您支持使 SitePoint 成为可能的合作伙伴。

Solidity 是一种相当新的语言,因为没有完美的代码,它包含与代码相关的问题以及你想用它完成的事情。 本文将指导您了解使用随机数作为以太坊智能合约输入时的最佳实践和陷阱。

Solidity 是一种相当新的语言,由于没有完美的代码这样的东西,它包含有关代码以及您希望用它完成什么的问题。 本文将指导您了解使用随机数作为以太坊智能合约输入时的最佳实践和陷阱。

Solidity 随机数生成

Solidity 无法创建随机数。 实际上,每个用于创建随机数的算法都是伪随机的——没有一种语言能够创建完全随机的数字。 Solidity 的问题是复杂的算法成本太高,所以更基础的使用解决方案。 除此之外,Solidity 代码应该是确定性的,因为它将在多个节点上运行。 我们需要一种能够生成一次随机数并在多个节点上使用它的算法。 时钟时间之类的东西不能用于生成随机数,因此我们必须考虑其他选项。 作为开发人员,您应该意识到这个问题,因为攻击者能够预测某些特定情况下的结果。

实体不能创建随机数。 实际上,用于创建随机数的每种算法都是伪随机的,并且没有一种语言能够创建完全随机数。 Solidity 的问题是复杂的算法非常昂贵,因此使用了更基本的解决方案。 除此之外,Solidity 代码应该是确定性的,因为它将在多个节点上运行。 我们需要一种可以生成一次随机数并在多个节点上使用它们的算法。 时钟时间之类的东西不能用于生成随机数,因此我们必须考虑其他选项。 作为开发人员,您应该意识到这个问题,因为攻击者可以预测某些情况下的结果。

最常用的算法之一是“线性同余生成器”(LCG)。 它是最古老的算法之一,速度快且易于理解。 LCG 是嵌入式系统的不错选择,因为它们的内存量有限。 但是,它不太适合加密安全应用程序。 尽管如此,这仍在智能合约中使用,因为就 gas 成本而言,快速算法的实施成本要低得多。

最常用的算法之一是“线性同余生成器”(LCG)。 它是最古老的算法之一,快速且易于理解。 对于嵌入式系统,由于内存量有限,LCG 是一个不错的选择。 但是,它不适用于密码安全的应用程序。 尽管如此,这种方法仍在智能合约中使用以太坊彩票项目,因为就 gas 成本而言,快速算法的实施成本要低得多。

该算法本身执行以下步骤:

该算法本身执行以下步骤:

让我们使用彩票智能合约示例探索创建随机数的不同方法。 用户可以通过向合约发送 0.1 以太币以及 0 到 250 之间的整数来加入彩票。

让我们使用彩票智能合约示例探索创建随机数的不同方法。 用户可以通过向合约发送 0.1 个以太币和一个 0 到 250 之间的整数来参与抽奖。

sitehqz.com 以太坊和以太坊贸易的关系_sitemytokencap.com 以太以太坊价格_以太坊彩票项目

1. Block.timestamp and Block.difficulty (1. Block.timestamp & Block.difficulty)

每当他确认交易时,矿工都会分配一个 block.timestamp。 我们彩票合约的任何玩家都无法控制它。 让我们看一下这段用于创建随机数的代码。

每当矿工确认交易时,block.timestamp 就会被分配 block.timestamp。 我们彩票合约中的任何玩家都无法控制它。 让我们看一下这段用于创建随机数的代码。

function random() private view returns (uint8) {
       return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251);
   }

在这里找到要点。

在这里找到要点。

这段代码先哈希一个区块时间戳和难度。 接下来,我们将哈希值转换为整数并将其除以 251 以获得 0 到 250 之间的整数。但是,这段代码的问题是我们不应该信任矿工来选择获胜者。

此代码首先对块的时间戳和难度进行哈希处理。 接下来,我们将哈希值转换为整数,然后将其除以 251 以获得 0 到 250 之间的整数。但是,此代码的问题在于我们不应该相信矿工会选择获胜者。

2. Lottery Input - Arbitrary Data(2. Lottery Input – Arbitrary Data)

我们需要更多的任意数据来挑选我们的赢家。 我们可以使用已经进入我们的彩票智能合约的玩家的地址,但我们必须对其他玩家隐藏它,因为他们可能会滥用它。 隐藏此信息是不可能的,因为它都记录在区块链上。

我们需要更多的任意数据来挑选我们的赢家。 我们可以使用已经进入彩票智能合约的玩家的地址,但是我们必须对其他玩家隐藏这个地址,因为他们可能会滥用它。 这些信息是不可能隐藏的,因为它都记录在区块链上。

sitehqz.com 以太坊和以太坊贸易的关系_以太坊彩票项目_sitemytokencap.com 以太以太坊价格

可以使用提交给我们的彩票智能合约的号码。 用户必须将他们选择的数字与他们的以太坊地址一起散列。 这给了我们一个非常随机的数字。

可以使用提交给我们的彩票智能合约的号码。 用户必须将他们选择的数字与以太坊地址一起散列。 这给了我们一个相当随机的数字。

3. 其他机制(3. Other Mechanisms) 3.1 以太坊闹钟(3.1 Ethereum Alarm Clock)

开发人员需要考虑何时选择获胜者。 诸如时钟时间之类的东西在以太坊虚拟机中不可用,因为代码将在不同的时间在多个节点上运行。 这使得选择赢家变得更加困难。 一种方法是在您的智能合约中实现一个功能,该功能将关闭彩票并选出中奖者。 这并不像我们希望的那样去中心化。 当合同的所有者确定他们的朋友会中奖时,他可以关闭彩票。 我们希望避免这种作弊行为。

开发人员需要考虑何时选择获胜者。 像时钟时间这样的特性在以太坊虚拟机中是不可用的,因为代码会在不同的时间在多个节点上运行。 这使得挑选赢家变得更加困难。 一种方法是在智能合约中实现一个功能,该功能将关闭彩票并选择中奖者。 它不像我们希望的那样分散。 当合约的所有者确定他的朋友会中奖时,他可以关闭彩票。 我们希望避免这种作弊行为。

更好的选择是使用以太坊闹钟。 它是一种允许安排交易在以太坊区块链上稍后执行的服务。 该服务是完全无需信任的,这意味着整个服务作为智能合约运行。 基本上,以太坊闹钟使用区块号来安排交易。 注意,这并不意味着合约会自行唤醒。 它依赖于有兴趣(Ether 奖励)的用户调用“选择获胜者”功能。 当然,如果没有人调用你的函数,你的抽奖就会失败。

更好的选择是使用以太坊闹钟。 它是一项允许计划在以后在以太坊区块链上执行交易的服务。 该服务完全无需信任,这意味着整个服务作为智能合约运行。 基本上以太坊彩票项目,以太坊闹钟使用块号来安排交易。 请注意,这并不意味着合约会自动唤醒。 它依赖于有兴趣的用户(以太坊奖励)来调用“选择赢家”功能。 当然,如果没有人调用你的函数,你的彩票就会输。

3.2 随机数据输入(3.2 Random Data Input)

Random.org 提供了一个 API,它通过 JSON 为您提供随机数据源。 以太坊智能合约可以使用此数据源来提供选择随机数的算法。 由于安全性很重要,因此可以使用数字签名。 随机数据将由 Random.org 签名。 您可以验证数据的完整性,从而证明它确实来自 Random.org 并且数据没有被篡改。

Random.org 提供了一个 API,通过 JSON 为您提供随机数据源。 以太坊智能合约可以使用这个数据源来提供选择随机数的算法。 由于安全性很重要,因此可以使用数字签名。 随机数据将由 Random.org 签名。 您可以验证数据的完整性,这可以让您证明数据确实来自 Random.org 并且数据未被篡改。

RANDAO 是区块链领域的一个新项目,专注于提供随机数。 他们结合使用预言机和智能合约为您提供随机数。 但是,RANDAO 服务目前非常慢。 如果您有一个经常使用的应用程序,这并不理想。

RANDAO 是区块链领域的一个新项目,只专注于提供随机数。 他们结合使用预言机和智能合约来为您提供随机数。 但是,RANDAO 服务目前非常慢。 如果您有经常使用的应用程序,这并不理想。

3.3 区块号观察者(3.3 Blocknumber Watcher)

sitemytokencap.com 以太以太坊价格_sitehqz.com 以太坊和以太坊贸易的关系_以太坊彩票项目

您还可以在代码中使用观察器,它会检查区块编号,直到它与您设置的目标编号相匹配。

您还可以在代码中使用观察器来检查区块编号,直到它与您设置的目标编号相匹配。

function f( blocknumber, to_address, value_) { 
  var filter = web3.eth.filter('latest').watch(
    function(err, blockHash) { 
      var target=blocknumber; 
      if(web3.eth.blockNumber==target) { 
        filter.stopWatching(); // your function here 
        web3.eth.sendTransaction({to:to_address, from:web3.eth.coinbase, value: web3.toWei(value_,"ether")});
        filter = null; 

以太坊彩票项目_sitemytokencap.com 以太以太坊价格_sitehqz.com 以太坊和以太坊贸易的关系

console.warn('Block reached'); if (callback) return callback(false); else return false; } else { console.log('Waiting the block'); } }); };

来源。 要旨。

来源.要点

3.4 iOlite智能合约创建(3.4 iOlite智能合约创建)

sitehqz.com 以太坊和以太坊贸易的关系_sitemytokencap.com 以太以太坊价格_以太坊彩票项目

iOlite 正在创建一种接受自然语言来创建智能合约的产品。 它使用称为快速适应引擎 (FAE) 的斯坦福自然语言处理 (NLP) 引擎。 iOlite 依赖于 Solidity 专家的社区培训。 Solidity experts (can dealers) 结构包含一个或多个句子并将其附加到相应的智能合约代码。

iOlite 正在创建一种接受自然语言来创建智能合约的产品。 它使用称为快速适应引擎 (FAE) 的斯坦福自然语言处理 (NLP) 引擎。 iOlite 依赖于 Solidity 专家的社区培训。 Unity 专家(贡献者)可以定义包含一个或多个句子的结构,并将它们附加到相应的智能合约代码中。

斯坦福 NLP 引擎的创建是为了理解复杂的语言。 语言的复杂程度取决于机器训练的数量。 经过适当的培训,该引擎将能够创建复杂的智能合约。 FAE 能够创建诸如合同之类的东西,一个复杂的合同实际上并不那么复杂。 专家可以将请求拆分成多个更小的代码片段,并将其附加到一个句子中。

已经创建了可以理解复杂语言的斯坦福 NLP 引擎。 语言的复杂性取决于机器训练的数量。 通过适当的培训,引擎将能够创建复杂的智能合约。 FAE 能够创建此类合同,因为复杂的合同实际上并不那么复杂。 专家可以将请求分解为多个较小的代码段,并将它们附加到一个句子中。

当有人输入多个句子时,它会寻找相应的结构/句子来构建“复杂”合约。 贡献者将通过新结构的挖掘过程获得 iOlite 代币奖励。

当有人输入多个句子时,它会寻找相应的结构/句子来构建“复杂”的合约。 通过新结构的挖矿过程,贡献者将获得 iOlite 代币奖励。

使用iOlite的好处是智能合约专家可以为您解决随机数生成等疑难问题。 您可以在 iOlite.io 上找到更多信息。

使用iOlite的好处是智能合约专家可以为您解决疑难问题,例如生成随机数。 您可以在 iOlite.io 上找到更多信息。

结论

如您所见,生成真正的随机输入并非易事。 不要依赖 block.timestamp、now 和 block.blockhash 作为随机源。 一个好的解决方案包括多个伪随机数据输入的组合以及使用 oracles 或智能合约以使其更可靠。 你需要 100% 确定没有人可以篡改输入到你的智能合约中的数据。

如您所见,生成真正随机的输入并非易事。 不要依赖 block.timestamp、now 和 block.blockhash 作为随机源。 一个好的解决方案包括多个伪随机数据输入的组合,以及使用预言机或智能合约以使其更可靠。 您需要 100% 确定没有人可以篡改智能合约中输入的数据。

在实现随机数生成逻辑之前要小心并三思。

在实现随机数生成逻辑之前请三思。

译自:

以太坊坚固性