建议和反馈

请填写你的反馈内容

问答 > DeFi > 问答详情
求助中

基于时间的 Staking 合约:需要避免循环10LK

我们正在以太坊主网上建立一个 staking 智能合约。所有的赌注都需要有一个时间戳,所以我们的逻辑依赖于时间。逻辑是在月底每个利益相关者都会有信用,并在此基础上,合约所有者将根据每个利益相关者的信用金额将奖励分配给他们。但是为了获得总 creditsAmount,我们需要遍历权益持有者列表,这是非常昂贵的。这是我们的抵押合约的一个非常简短的例子:

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;
      }
    }
   }

因此,您可以想象最后一个循环的成本非常高,但我们目前没有找到其他方法。您对如何避免这种循环有什么想法吗?或者其他像我们一样依赖时间的 Staking 合约?


YYF
2021-07-27
0
请先登陆或注册

新百胜2021-08-26

新百胜国际公司网站w w w.xbs2277.com客服131  1416  6111

核心提示:1,玩家可以直接与新百胜公司联系,以维持更多的利益和财务安全。

 2,您在细分时必须联系公司的客服(如果不是直接联系客服,公司也很难追踪),不要相信所有的积分代表积分。 

3,新百胜公司可以随时支持实时视频验证,可以安排相关人员根据您的指示进行现场验证是否是实时同步的。承诺所有业务透明公开,绝不假冒!

十五年的现场实体,口碑是最好的保证。 

4,玩家还可以到现场亲身体验游戏,可以享受多种优惠待遇,报销往返机票,准五星级酒店住宿和餐厅免费用餐,以及偶尔的慢摇聚会。

155429105678.jpg


投一票
评论(0)
赞赏(0)
xiaohei2021-07-29

挖矿交流,资料分享。欢迎咨询V:GBLS18057440235

投一票
评论(0)
赞赏(0)

求助中

解决了这个问题,预计可以帮助到

  • 0
  • 2
  • 1
  • 0
  • 9
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励