Как сравнить два массива в Solidity

Как я могу сравнить два массива в Solidity (с тестовой средой Truffle)?

MyContract.sol --

pragma solidity 0.4.19;

contract MyContract {   
  uint[] public myArr;

  MyContract(uint[] _initArr) public {
    for (uint i=0; i < _initArr.length; i++) {
      myArr.push(_initArr[i]);
    }
  }

  function getMyArr public constant returns (uint[]) {
    return myArr;   
  } 
}

В тесте трюфеля/TestMyContract.sol

pragma solidity 0.4.19;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/MyContract.sol";

contract TestMyContract {
  function testMyContract() public {
    uint[] storage expectedArr;
    expectedArr.push(0);
    expectedArr.push(1);
    expectedArr.push(2);

    MyContract myContract = new MyContract(expectedArr);

    Assert.equal(myContract.getMyArr(), expectedArr, "pass");
  }
}

"трюфельный тест" выдает ошибку --

TypeError: Member "equal" is not available in type(library Assert) outside of storage.
        Assert.equal(myContract.getMyArr(), expectedArr, "pass");
        ^----------^

Есть ли способ написать модульный тест для массивов Solidity?

Ответы (2)

Я не уверен, работает ли эта реализация сейчас.

Но поскольку столкновение хэшей так себе... сложно, вы можете хешировать два разных массива и сравнивать их хэши. Если это возможно сделать, будет намного лучше, чем ходить по каждому индексу и проверять его. Да и по расходу газа будет гораздо эффективнее.

Assert.equal(keccak256(expectedarr), keccack(myArr),"pass");

Дайте мне знать, если это работает для вас.

насколько я знаю, вы должны написать Assert.equal- Call для каждого значения в вашем массиве.

Вот так:

Assert.equal(expectedArr[0], myContract.myArr[0], “pass“);
Assert.equal(expectedArr[1], myContract.myArr[1], “pass“);
Assert.equal(expectedArr[2], myContract.myArr[2], “pass“);

Надеюсь, это поможет.