首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于时间的押注契约:需要避免循环

基于时间的押注契约:需要避免循环
EN

Stack Overflow用户
提问于 2021-07-15 10:01:39
回答 1查看 543关注 0票数 0

我们正在ethereum主干网上建立一份明智的合同。所有的赌注都需要附加一个时间戳,所以我们的逻辑依赖于时间。逻辑是在月底,每个涉众都将有信用,并且基于此,合同所有者将根据他们的creditsAmount将奖励给每个涉众。但是为了获得总creditsAmount,我们需要迭代stakeHolders的列表,这是非常昂贵的。这里有一个非常简短的例子,说明我们的赌注合同:

代码语言:javascript
复制
pragma solidity 0.8.6;
import “@openzeppelin/contracts/utils/structs/EnumerableSet.sol”;

contract Test {
  using EnumerableSet for EnumerableSet.AddressSet;

  struct Stake {
    uint256 lockedToken;
    uint256 creditsEarned; // numberOfDays * lockedToken = 15days * 1000 = 15000
  }
  
  // Rewards = RatioOfCreditsEarnedByStakeholder * MonthlyRewards

  EnumerableSet.AddressSet private stakeholders;
  mapping(address => Stake) private stakeholderToStake;

  function createStake(
   address stakeholder,
   uint256 lockedToken,
   uint256 creditsEarned
  ) public {
   stakeholders.add(stakeholder);
   stakeholderToStake[stakeholder] = Stake({
     lockedToken: lockedToken,
     creditsEarned: creditsEarned
   });
  }
      
function distributeRewards() public {
  uint256 totalCredits = 0;
  for (uint256 i = 0; i < stakeholders.length(); i++) {
    totalCredits += stakeholderToStake[stakeholders.at(i)].creditsEarned;
      }
    }
   }

因此,正如您可以想象的那样,最后一个循环非常昂贵,但我们目前还没有找到其他方法。对于如何避免这样的循环,你有什么想法吗?还是像我们一样依赖时间的其他赌博合同?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-16 08:54:47

为了扩展我的评论,我将这样做。

代码语言:javascript
复制
pragma solidity 0.8.6;
import “@openzeppelin/contracts/utils/structs/EnumerableSet.sol”;

contract Test {
using EnumerableSet for EnumerableSet.AddressSet;

struct Stake {
      uint256 lockedToken;
      uint256 creditsEarned;
   }
  
  // Rewards = RatioOfCreditsEarnedByStakeholder * MonthlyRewards

  EnumerableSet.AddressSet private stakeholders;
  mapping(address => Stake) private stakeholderToStake;
      
  uint256 private totalCredits;

  function createStake(
     address stakeholder,
     uint256 lockedToken,
     uint256 creditsEarned
  ) public {
      stakeholders.add(stakeholder);
      stakeholderToStake[stakeholder] = Stake({
      lockedToken: lockedToken,
      creditsEarned: creditsEarned
     });
    totalCredits += creditsEarned;
  }
      
  function distributeRewards() public {
  //do whatever you want with totalCredits here
   }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68391739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档