- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目的是使用B合约中的这个变量我尝试使用委托(delegate)调用但不起作用,仅适用于事件
契约(Contract)B.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.8.0;
contract ContractB {
uint256 public tokenName = uint256(2);
event SetToken(uint256 _tokenName);
function setTokenName(uint256 _newName) external returns (uint256) {
setInternal(_newName);
}
function setInternal (uint256 _newName) public returns (uint256)
{
tokenName = _newName;
emit SetToken(tokenName);
return tokenName;
}
function getTokenName() public view returns (uint256)
{
return tokenName;
}
}
计数器.sol
//Begin
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
interface KeeperCompatibleInterface {
function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);
function performUpkeep(bytes calldata performData) external;
}
contract Counter is KeeperCompatibleInterface {
uint256 public counter; // Public counter variable
// Use an interval in seconds and a timestamp to slow execution of Upkeep
//60 seconds
uint public immutable interval;
uint public lastTimeStamp; //My counter was updated
//**
address contractBAddress;
uint256 public tokenName = uint256(2);
//**
constructor(uint updateInterval,address _contractBAddress) {
interval = updateInterval;
lastTimeStamp = block.timestamp;
counter = 0;
contractBAddress=_contractBAddress;
}
function checkUpkeep(bytes calldata checkData) external view override returns (bool upkeepNeeded, bytes memory performData) {
upkeepNeeded = (block.timestamp - lastTimeStamp) > interval;
performData = checkData;
}
//When checkUpKeep its already to launch, this task is executed
function performUpkeep(bytes calldata) external override {
lastTimeStamp = block.timestamp;
counter=0;
counter = counter + 1;
(bool success, bytes memory returndata) = contractBAddress.delegatecall(
abi.encodeWithSignature("setTokenName(uint256)", counter)
);
// if the function call reverted
if (success == false) {
// if there is a return reason string
if (returndata.length > 0) {
// bubble up any reason for revert
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert("Function call reverted");
}
}
}
function getTokenName() public view returns (uint256)
{
return tokenName;
}
}
事件运行完美,但我无法更改 ContractB.sol 中的状态 ... https://kovan.etherscan.io/tx/0x7fbacd6fa79d73b3b3233e955c9b95ae83efe2149002d1561c696061f6b1695e#eventlog
最佳答案
该事件的完美运作证明了 Keeper 的工作做得很好。这里的问题是 delegatecall
本身。
当合约A
对合约B
执行delegatecall
时,B
的代码与合约一起执行>A
的存储,msg.sender
和msg.value
。存储、当前地址和余额仍然引用调用合约(contract A
),只是code取自被调用地址(contract B
)。
在您的例子中,setTokenName
更新了 ContractB
的 tokenName
,因此 ContractB
的存储槽 0。 Counter
智能合约中相同的存储槽是uint256 public counter
。当您执行 delegatecall
时,您使用 ContractB
的 更新了
函数逻辑。Counter
的存储(counter
变量) setTokenName
既然你知道 ContractB
的 ABI,你为什么不做这样的事情呢?
pragma solidity ^0.8.0;
import "./ContractB.sol";
contract Counter is KeeperCompatibleInterface {
ContractB public contractB;
uint256 public counter;
constructor(ContractB _contractBAddress) {
contractB = _contractBAddress;
}
function performUpkeep(bytes calldata) external override {
counter = counter + 1;
contractB.setTokenName(counter);
}
}
关于solidity - 从 Keeper 更改合约 B 的变量状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69976064/
有人可以告诉我为什么 FCC 不接受我的解决方案,即使它通过了所有测试? 下面是挑战的链接,但我将在此处发布问题和测试,以更好地遵守社区。 FCC 挑战: https://www.freecodeca
目的是使用B合约中的这个变量我尝试使用委托(delegate)调用但不起作用,仅适用于事件 契约(Contract)B.sol // SPDX-License-Identifier: MIT prag
我正在开发一个简单的记分器应用程序,但有一些事情没有按预期工作。 https://codepen.io/Modestas/pen/LjPPVQ 这是我的代码部分: if ( p1ScoreCount
所以在做一个小项目的同时考虑让 map 更高效。我有一个数字网格 100110 011011 010110 如果您曾经玩过地牢守护者,您的想法是 0 是一个平坦的挖方 block ,而 1 是一个静止
前几天,Google 通知我,我的 Gmail 帐户可能已被盗用,因为它已被两个来自异常位置的 IP 地址访问。由于我通常(并且愚蠢地)为每个网站使用相同的密码,所以我决定改变一下并使用不同的密码。
我希望 Chainlink Keeper 根据一些参数调用一个函数,所以我的 checkUpkeep 函数如下: function checkUpkeep( bytes calldat
就像标题所说的那样,似乎已经满足了 keeper 运行 performUpkeep 的所有条件,但它并没有被调用。 这是维护链接:https://keepers.chain.link/kovan/up
我想在我的代码中使用 run keeper API,因为我正在开发将跟踪步行距离等的应用程序。这可以通过使用 Run Keeper API 来完成。 在注册我的应用程序期间,它要求我输入回拨 URL,
我一直在使用 apache Zookeeper,并被要求阅读包含以下属性的 Zoo.cfg: tickTime=2000 dataDir=/var/lib/zookeeper clientPort=2
我是一名优秀的程序员,十分优秀!