Инициировать динамический массив строк

#javascript #ethereum #solidity

#javascript #ethereum #надежность

Вопрос:

У меня есть следующий контракт

 pragma solidity >=0.4.21 <0.7.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract Sketch is ERC721 {
  string[] public sketchs;
  mapping(string => bool) _sketchExists;
  constructor() ERC721("Sketch", "SKETCH") public {
  }
  function mint(string memory _sketch) public {
    uint _id = sketchs.push(_sketch);
    _mint(msg.sender, _id);
    _sketchExists[_sketch] = true;
  }
}
  

Но когда я запускаю тест truffle, я получаю сообщение об ошибке
Ошибка типа: разное количество компонентов с левой стороны (1), чем с правой стороны (0) «
По отношению к строке

 uint _id = sketchs.push(_sketch)
  

Как бы мне обойти это? Должен ли я заранее инициировать эскизы? Как это будет выглядеть?

Любая помощь будет оценена

Ответ №1:

Поскольку solidity docs members-> push(x): push(x) метод ничего не возвращает

push(x): динамические массивы хранения и байты (не строки) имеют функцию-член с именем push(x), которую можно использовать для добавления заданного элемента в конец массива. Функция ничего не возвращает.

Вы можете изменить код и получить идентификатор следующим образом:

 sketchs.push(_sketch);
uint _id = sketchs.length - 1;