我们正在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-16 08:54:47
为了扩展我的评论,我将这样做。
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
}https://stackoverflow.com/questions/68391739
复制相似问题