我们正在ethereum主干网上建立一份明智的合同。所有的赌注都需要附加一个时间戳,所以我们的逻辑依赖于时间。逻辑是在月底,每个涉众都将有信用,并且基于此,合同所有者将根据他们的creditsAmount将奖励给每个涉众。但是为了获得总creditsAmount,我们需要迭代stakeHolders的列表,这是非常昂贵的。这里有一个非常简短的例子,说明我们的赌注合同:
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;
}
}
}因此,正如您可以想象的那样,最后一个循环非常昂贵,但我们目前还没有找到其他方法。对于如何避免这样的循环,你有什么想法吗?还是像我们一样依赖时间的其他赌博合同?
谢谢
发布于 2021-07-15 12:04:55
对于distributeRewards函数的用例,我不是百分之百肯定。这个函数看起来还没有完成,而且由于您没有对totalCredits变量做任何事情,所以在结束时缺少了一些逻辑。
我也没有看到任何功能,以使斯塔克如何使他们的creditsEarned增加。
但我会同意我目前所知道的。如果您需要一个金额的所有学分,已经赢得了一个特定的时期。您应该有一个名为sumOfCredits的状态变量,它从0开始,每次增加单个staker的Stake.creditsEarned时,get都会增加。因此,随着越来越多的人获得个人报酬,学分的总和在状态变量中不断积累。
然后,一旦您想要在distributeRewards中分发奖励,您可以只使用现在已经保存在状态变量sumOfCredits中的总数。如果你想把它重置回0,你也可以用同样的函数来做。
但这是一种奇怪的赌博方式。大多数项目将做的是让每个利益相关者分配或创造他们自己的回报。他们为得到自己报酬所需的汽油付了钱。但我希望这能帮上忙。
https://ethereum.stackexchange.com/questions/103512
复制相似问题