Предположим, у меня есть эта структура:
struct TextThatWorks {
bytes32 text;
uint reads;
}
Как я могу добавить address
к нему переменную?
Я попытался просто добавить address someadress;
внутри объявления структуры, например:
struct TextThatDoesNotWork {
bytes32 text;
uint reads;
address addr;
}
Я видел много примеров, делающих то же самое. Пример: документы Solidity
Но когда я это делаю, мои функции ломаются.
Итак, в моем контракте у меня есть массив Text:
TextThatWorks[] public textArray;
И у меня есть функция для вызова текстов внутри этого массива, которая возвращает массивы:
function listTexts () public view returns (bytes32[], uint[]) {
bytes32[] memory texts = new bytes32[](textArray.length);
uint[] memory readsArray = new uint[](textArray.length);
for (uint i = 0; i < textArray.length; i++){
texts[i] = textArray[i].text;
readsArray[i] = textArray[i].reads;
}
return (texts, readsArray);
}
Это возвращает хороший массив в формате[["some hexadecimal example"],[12]]
Вторая структура TextThatDoesNotWork
отличается только TextThatWorks
тем, что имеет address
поле.
Когда я его использую, моя listTexts()
функция перестает работать. Он всегда возвращает пустые массивы, например[[],[],[]]
Чтобы разместить дополнительное поле, моя listTexts()
функция становится следующей:
function listTexts () public view returns (bytes32[], uint[], address[]) {
bytes32[] memory texts = new bytes32[](textArray.length);
uint[] memory readsArray = new uint[](textArray.length);
address[] memory addresses = new address[](textArray.length);
for (uint i = 0; i < textArray.length; i++){
texts[i] = textArray[i].text;
readsArray[i] = textArray[i].reads;
addresses[i] = textArray[i].addr;
}
return (texts, readsArray, addresses);
}
function put(bytes32 _text, uint _reads) public returns (uint){
return textArray.push(TextThatDoesNotWork({
text: _text,
reads: _reads,
addr: msg.sender
}))-1;
}
Диего Лима
contract.put("text", 200)
, я получаю хэш транзакции в консоли вместо индекса, возвращаемого функцией. Может ли проблема быть в том, как я вызываю функциюput()
?Аквила
put
функции — это другой вопрос. Что у вас есть после действий: контракт развертывания -> вызовput(0x1221, 10)
-> вызовlistTexts()
?Аквила
contract.put("text", 200)
не будет работать, потому что первый параметр имеет типbytes32
, вам нужно преобразовать строку в bytes32, вы можете использоватьweb3.utils.fromAscii("text")
функциюДиего Лима
address
атрибут в структуру. Он просто перестает работать, но до добавления этого атрибута он работает!Диего Лима
address
атрибута в структуре я могу развернуть контракт, вызватьcontract.put("some text", 200)
и просмотреть новые данные с помощьюcontract.listTexts()
.Аквила
Диего Лима
Аквила
solc
илиtruffle
с тестами.Технический инженер Нью-Йорка