Solidity/Remix: 为什么这个函数在分配数组成员时失败?

Solidity/Remix: Why does this function fail on assignment of an array member?

我编写了这个简单的函数来获取字符串数组并消除重复项,但它会使用提供的参数恢复 ["a","b","c"]。我认为它可能与 equals 函数(比较两个字符串)有关,但它本身运行良好。在调试器中,它挂在如下所示的赋值语句上,该语句出现在 equals 函数调用之前。

任何想法表示赞赏。

pragma solidity >=0.7.0 <0.9.0;
contract Tester  {
    
    function dedupeKeys(string[] memory keys) public pure returns(string[] memory) {
       
        string[] memory deduped;
         if (keys.length == 0) return deduped;  
        bool found;
        string memory key;
        key = keys[0];
        deduped[0] = key;   //REMIX DEBUGGER HANGS HERE.            
        for(uint i=1; i<keys.length; i++) {
            found = false;
            key = keys[i];
            for(uint j=0; j<keys.length; j++) {
                if(equal(deduped[j], key)) {
                   found=true; 
                }
            }
            if (!found) {
                deduped[deduped.length]=key;
            }
        }
        return deduped;
    }
    
    function equal(string memory _base, string memory _value)
        internal
        pure
        returns (bool) {
        bytes memory _baseBytes = bytes(_base);
        bytes memory _valueBytes = bytes(_value);

        if (_baseBytes.length != _valueBytes.length) {
            return false;
        }

        for (uint i = 0; i < _baseBytes.length; i++) {
            if (_baseBytes[i] != _valueBytes[i]) {
                return false;
            }
        }

        return true;
    }

}

您正在尝试访问越界数组索引。

此行创建包含 0 项的数组:

string[] memory deduped;

在这里,您正在尝试访问 第一项(索引 0):

deduped[0] = key;   //REMIX DEBUGGER HANGS HERE.  

在当前的 Solidity 版本 (0.8.x) 中,无法调整内存阵列的大小。所以你需要用正确的尺寸创建它,并预先计算尺寸。有关代码示例,请参阅 this answer