Вызвать функцию записи, которая не меняет стоимость контракта

Я новичок в смарт-контрактах и ​​столкнулся с одной проблемой. После развертывания контракта в моей тестовой локальной сети блокчейна я пытаюсь установить новое значение через сеттер, после этого я вызываю метод получения контракта, и он возвращает старое значение.

Это мой контракт,

pragma solidity ^0.4.10;

contract Storage {
    uint256 storedData;

    function set(uint256 data) {
        storedData = data;
    }

    function get() constant returns (uint256) {
        return storedData;
    }
}

Какие шаги я сделал:

  1. Разверните контракт через web3j в java-коде, после развертывания я вижу адрес своего контракта, поэтому он развернут
  2. После этого в консоли geth создайте переменную abi: var abi = [{"constant":false,"inputs":[{"name":"data","type":"uint256"}],"name":"set ","выходы":[],"оплачиваемый":ложь,"изменяемость состояния":"неоплачиваемый","тип":"функция"},{"константа":истина,"входы":[],"имя": «получить», «выводы»: [{«имя»: «», «тип»: «uint256»}], «оплачиваемый»: false, «изменяемость состояния»: «представление», «тип»: «функция»}] ;
  3. контракт загрузки: var storage = eth.contract(abi)
  4. загрузить контракт по адресу: var contractInstance = storage.at("0x45564fe8d90e542f3f896dd43b374210bc109299");
  5. попробуйте вызвать метод get(): var result = contractInstance.get(); это выход 0
  6. затем попробуйте установить новое значение: var result = contractInstance.set(566); After that I see something like this: INFO [09-07|08:42:07] Submitted transaction fullhash=0x7110b3fdfc8005187ed367beb8275a6f4b926f4852f726784219a5a3aa9c8d9e recipient=0x45564fe8d90e542f3f896dd43b374210bc109299 "0x7110b3fdfc8005187ed367beb8275a6f4b926f4852f726784219a5a3aa9c8d9e"
  7. Затем я запускаю майнинг: miner.start(), в начале майнинга вижу такой лог: INFO [09-07|08:44:15] Commit new mining work number=38 txs=1 uncles=0 elapsed=1.044 ms INFO [09-07|08:44:15] Успешно запечатанный новый блок номер=38 hash=e62548…39ad89 INFO [09-07|08:44:15] 🔗 блок достиг канонического номера цепочки=33 hash=9a6ae1…9cb82d INFO [09-07|08:44:15] 🔨 добытый потенциальный блок номер=38 hash=e62548…39ad89 INFO [09-07|08:44:15] Commit new mining work number=39 txs=0 uncles=0 истекло =182,5 мкс INFO [09-07|08:44:15] Успешно запечатанный новый блок номер=39 hash=87b682…f52e39 INFO [09-07|08:44:15] 🔗 блок достиг канонического номера цепочки=34 hash=cc9a2d …36838a INFO [09-07|08:44:15] 🔨 добытый потенциальный блок номер=39 hash=87b682…f52e39 INFO [09-07|08:44:15] Майнинг слишком далеко в будущем wait=2s
  8. Затем я прекращаю майнинг: miner.stop() 9. Затем вызываю contractInstance.get(): и вижу то же значение 0

Я в замешательстве (Спасибо всем за помощь!

Ваш код правильный, и я проверяю, все ли в порядке. вы подтверждаете, что добыча успешна?
@BinGoBinBin Думаю, да. Вот мой лог, когда я начинаю майнить. Начало операции майнинга INFO [09-06|18:10:01] Зафиксировать новый номер работы майнинга=1400 txs=6 uncles=0 истекло=1,092 мс INFO [09-06|18:10:01] Успешно запечатан новый номер блока= 1400 хэш=8cd59b…0bb28c ИНФОРМАЦИЯ [09-06|18:10:01] 🔗 достигнут блок номер канонической цепочки=1395 хеш=81696a…5fc7fa ИНФО [09-06|18:10:01] 🔨 добыт потенциальный блок номер=1400 хэш=8cd59b…0bb28c
Можете ли вы добавить точный способ вызова этих функций через web3? Кроме того, между miner.start() и вызовом этих функций вы должны увидеть что-то вроде «Транзакция добавлена ​​в пул». Вы можете подтвердить, что видели что-то подобное?
@ wtk219 Я обновляю свой вопрос и предоставляю более подробные шаги, которые я сделал.
Попробуйте storedDataуказать значение по умолчанию, прежде чем пытаться его изменить, это скажет вам, связана ли ваша проблема с чтением или записью.
@EdmundEdgar добавил значение по умолчанию, оно по-прежнему возвращает 0 , я думаю, что проблемы в библиотеке web3j, похоже, это неправильное создание оболочки для смарт-контракта.
@EdmundEdgar Я даже изменил функцию get, чтобы она возвращала литерал (256), но все равно возвращает 0, может быть, это какая-то ошибка в контрактной версии или какая-то сложная проблема, я действительно запутался
Общие советы: 1. Используйте последнюю версию Solidity, 2. Не забывайте о constructor()функции.

Ответы (1)

Используйте следующие команды:

storage.get.call() 0 storage.set.sendTransaction(42, {from: eth.accounts[0], gas: 1000000}) "0x7a54ab329fcbf551432eb78c4b2a1ff48fc8b9f9aa23d94fa86330e5c1d711f3" storage.get.call() 42

Ссылка на ссылку: https://medium.com/@gus_tavo_guim/deploying-a-smart-contract-the-hard-way-8aae778d4f2a