Delegatecall:函数不会更改 parentContract 数组元素
Delegatecall: function doesn't change a parentContract array element
我部署了两个合约 (A,B)。函数 A.delegateUpdateIDX[contract_B,1] 触发函数 B.updateIDX[1]
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.4;
contract A {
string[] private arr = ['a','b','c'];
function showIDX(uint _IDX) public view returns(string memory)
{
return arr[_IDX];
}
function delegateUpdateIDX(address _contractB, uint _IDX) external returns(bool _success)
{
(bool b,)=_contractB.delegatecall( abi.encodeWithSignature("updateIDX(uint _IDX)", _IDX) );
return b;
}
}
//###################################
contract B {
string[] private arr;
function updateIDX(uint _IDX) external
{
arr[_IDX]='X';
}
}
然后我调用函数(在 Remix 中):
A.showIDX[1]
returns 'b'
A.delegateUpdateIDX(B.address,1)
no errors
(should update A.storage and set A.arr[1] to 'X')
but the delegateCall() returns 'success=false' for some reason
and A.arr[1] doesn't change to 'X'
A.showIDX[1]
returns 'b' again (not 'X' as expected)
所以,基本上,我不知道为什么 delegateCall() returns 'success=false' 以及为什么 A.arr[1] 没有从 'b' 变为 'X'。我做错了什么?
设法让它发挥作用
- abi.encodeWithSignature("updateIDX(uint _IDX)", _IDX) 中不应该有 '_IDX' 名称,所以我将其更改为 abi.encodeWithSignature("updateIDX(uint)", _IDX)
-- 还是不行,delegateCall() 一直返回 'false' --
- 在 encodeWithSignature() 和 B.updateIDX()
中将 'uint' 更改为 'uint256'
这次效果很好
我部署了两个合约 (A,B)。函数 A.delegateUpdateIDX[contract_B,1] 触发函数 B.updateIDX[1]
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.4;
contract A {
string[] private arr = ['a','b','c'];
function showIDX(uint _IDX) public view returns(string memory)
{
return arr[_IDX];
}
function delegateUpdateIDX(address _contractB, uint _IDX) external returns(bool _success)
{
(bool b,)=_contractB.delegatecall( abi.encodeWithSignature("updateIDX(uint _IDX)", _IDX) );
return b;
}
}
//###################################
contract B {
string[] private arr;
function updateIDX(uint _IDX) external
{
arr[_IDX]='X';
}
}
然后我调用函数(在 Remix 中):
A.showIDX[1]
returns 'b'
A.delegateUpdateIDX(B.address,1)
no errors
(should update A.storage and set A.arr[1] to 'X')
but the delegateCall() returns 'success=false' for some reason
and A.arr[1] doesn't change to 'X'
A.showIDX[1]
returns 'b' again (not 'X' as expected)
所以,基本上,我不知道为什么 delegateCall() returns 'success=false' 以及为什么 A.arr[1] 没有从 'b' 变为 'X'。我做错了什么?
设法让它发挥作用
- abi.encodeWithSignature("updateIDX(uint _IDX)", _IDX) 中不应该有 '_IDX' 名称,所以我将其更改为 abi.encodeWithSignature("updateIDX(uint)", _IDX)
-- 还是不行,delegateCall() 一直返回 'false' --
- 在 encodeWithSignature() 和 B.updateIDX() 中将 'uint' 更改为 'uint256'
这次效果很好