Я создал простой смарт-контракт для хранения больших объемов данных (13-20 КБ) в блокчейне Ethereum. Но когда я пытаюсь совершить транзакцию, они иногда терпят неудачу (с небольшой корреляцией с объемом данных) с ошибкой «Предупреждение! Ошибка во время выполнения контракта [Нет газа]».
Лимит газа составляет 3000000, и нет четкого порога данных, который приводит к сбою транзакции. Две транзакции с одинаковым содержимым могут вести себя по-разному (одна выдает ошибку, а другая нет).
Вот код, который я использую для хранения данных:
contract SimpleStorage {
mapping(address => string) public Usersdata;
function Storedata(string data) public {
Usersdata[msg.sender] = data;
}
function getData() public view returns (string) {
return Usersdata[msg.sender];
}
}
Основываясь на контракте, который вы прокомментировали (и я отредактировал, чтобы добавить к исходному вопросу), неудивительно, что вы столкнулись с проблемами с газом. Хранилище контракта стоит 20k за инициализацию слота, и каждый слот хранит 32 байта. Хранение 10 КБ данных в хранилище обойдется примерно в 10000/32*20000 газа, что составляет более 6 миллионов газа. Это также игнорирует стоимость данных в качестве входных данных, что недешево (хотя это намного дешевле, чем стоимость хранения). В целом, хранение таких больших наборов данных в сети считается плохой практикой.
natewelch_
Рон Берреби
natewelch_
Рон Берреби
natewelch_
Рон Берреби