web3.py: отправка эфира на умный контракт - PullRequest
0 голосов
/ 03 октября 2019

Я использую web3.py для взаимодействия с частной цепочкой блоков Ethereum. Я хотел бы вызвать следующую функцию в умном контракте:

    uint256 public cookiePrice;

    function feed(string memory message) public payable {
        require(cookiePrice <= msg.value);
        applyFeeding(msg.sender, message);
    }

Я пытаюсь назвать это так:

    price = contract.functions.cookiePrice().call()
    txn = contract.functions.feed("my message").buildTransaction({
      'chainId': 13999911119,
      'gas': 70000,
      'value': price,
      'gasPrice': w3.toWei('8', 'gwei'),
      'nonce': int(time.time())
    })
    signed_txn = w3.eth.account.sign_transaction(txn, private_key=private_key)
    w3.eth.sendRawTransaction(signed_txn.rawTransaction)

Кажется, что это успешно, в этом sendRawTransaction возвращает хэш транзакции (как описано в документах ). Но по цепочке я вижу, что вызов на самом деле не вступил в силу.

Чего-то очевидного не хватает в приведенном выше коде? Кроме того, как я могу получить возврат sendRawTransaction, чтобы помочь мне отладить?

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Транзакции генерируются, даже если ваш код может не работать. Вы должны заплатить майнеру за выполнение кода, который потенциально изменяет цепочку блоков, и в случае сбоя во время выполнения вам может быть возвращен оставшийся газ, но транзакция все равно создается, и вам возвращается ее хэш.

Таким образом, возможно, что выполнение не выполнится внутри applyFeeding. На всякий случай он проверил бы несколько вещей на всякий случай:

  • Какой тип price? Если это int, мы в порядке.
  • Вы не указываете from, поэтому используется учетная запись по умолчанию. Убедитесь, что это именно то, что вам нужно, и что на счету достаточно средств, и что вы используете его закрытый ключ для подписи.
  • Проверьте наличие потенциальных проблем внутри applyFeeding, особенно связанных с тем, кто является отправителем, посколькуэто параметр этой функции.
  • Убедитесь, что используемого вами количества газа достаточно, и у вас не закончится газ.

К вашему сведению, если я правильно помню web3 имеет хорошие значения по умолчанию для нескольких параметров, таких как цена на газ, газ и одноразовые номера, которые динамически рассчитываются / оцениваются за вызов.

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

0 голосов
/ 04 октября 2019

Ваша транзакция, вероятно, никогда не была добыта, потому что ваш nonce был слишком высок. Одноразовый номер для учетной записи начинается с 0 и увеличивается ровно на 1 для каждой отправленной транзакции.

Вы можете использовать w3.eth.getTransactionCount, чтобы получить правильный одноразовый номер для используемой учетной записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...