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'。我做错了什么?

设法让它发挥作用

  1. abi.encodeWithSignature("updateIDX(uint _IDX)", _IDX) 中不应该有 '_IDX' 名称,所以我将其更改为 abi.encodeWithSignature("updateIDX(uint)", _IDX)

-- 还是不行,delegateCall() 一直返回 'false' --

  1. 在 encodeWithSignature() 和 B.updateIDX()
  2. 中将 'uint' 更改为 'uint256'

这次效果很好