Выполнить контракт из bash или внутри скрипта python

У меня есть кошелек Mist и контракт (с его адресом), который я выполняю из графического интерфейса Mist «вручную». Мне было интересно, как я могу выполнить его из командной строки (bash, а не geth) или вызвать это выполнение из скрипта Python. Если это возможно, не могли бы вы предоставить пример игрушки или дорожную карту? Заранее спасибо!

Вы можете вызвать geth из bash через интерфейс JSON-RPC с помощью curlкоманды
Также у python есть различные доступные библиотеки, такие как github.com/pipermerriam/web3.py , которые я настоятельно рекомендую
@MikkoOhtamaa спасибо! у вас есть какой-нибудь игрушечный пример или что-то, что укажет мне правильное направление? Как сообщение в блоге для чайников :) Особенно с библиотекой Python, выполняющей контракт.
@MikkoOhtamaa, это внутри консоли гетов, верно? у вас есть что-нибудь по скрипту python?
curlэто команда UNIX для bash. Извините, у меня есть только довольно сложные примеры Python. Документация Populus может иметь некоторые populus.readthedocs.io/en/latest/quickstart.html
спасибо @MikkoOhtamaa! сложные примеры Python? ты заставляешь меня удивляться сейчас! :) если они открыты, поделитесь ссылкой :)
Просто покопайтесь в репозиториях Populus, Web3, pyget и py-solc на Github.
Множество примеров на сайте с использованием сценария оболочки. Введите «/bin/sh EOF» (без кавычек) в поле поиска, и вы получите 12 результатов. Пример ethereum.stackexchange.com/questions/3570/… и ethereum.stackexchange.com/questions/7339/… . А на ethereum.stackexchange.com/a/8339/1268 есть скрипт, который отправляет grepи обрабатывает sedтолько интересующие данные.
@MikkoOhtamaa спасибо! сделает это. Не удалось найти ни одного видео на YouTube (учебник по этому вопросу). Как будет первым смелым :)
@BokkyPooBah, спасибо! я посмотрю на эти ссылки!
Столько хороших комментариев. Теперь кто-нибудь, напишите ответ, пожалуйста. :-)
Из bash я иногда делаю так: echo "<insert command here>" | geth attach. Это очень просто, и он возвращает результат в стандартный вид. Я часто использую curl, как указано выше.

Ответы (2)

Все это уже было изучено в комментариях, но я резюмирую как ответ!

Выполнение/вызов из bash

Это довольно подробно объясняется в Руководстве Homestead по доступу к контрактам и транзакциям .

С самых основ Ethereum имеет интерфейс RPC (удаленный вызов процедур), как прекрасно объясняется на странице RPC в Википедии . Интерфейс Ethereum RPC использует подмножество спецификации JSON-RPC 2.0 со следующими оговорками:

  • Числа закодированы в шестнадцатеричном формате.
  • Если метод RPC принимает номер блока, вы можете отправить либо фактический номер, либо одну из следующих строк: «самый ранний», «самый последний», «ожидающий».

Команды с баш

Используя интерфейс RPC, мы можем выполнять такие команды, как eth_coinbase, которые возвращают ваш ETH-адрес:

> curl --data '{"jsonrpc":"2.0","method":"eth_coinbase", "id":1}' localhost:8545

Что печатает:

{"id":1,"jsonrpc":"2.0","result":["0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a"]}

Взаимодействие с развернутыми контрактами с помощью bash

Взаимодействие с функциями из предварительно развернутых контрактов осуществляется через сигнатуру их функции, которую можно найти, взяв первые 4 байта вывода sha3('functionName(functionParameterTypes)'). Это можно вычислить внутри geth, например, с помощью

> web3.sha3("multiply(uint256)").substring(0, 8)
"c6888fa1"

Полезным примечанием здесь является то, что даже если вы использовали uintили intв рамках вашего контракта, вам придется использовать реальную сделку, например, uint256.

Вы дополняете свой ввод (закодированный в шестнадцатеричном формате) нулями, как показано ниже, для примера ввода 6:

0000000000000000000000000000000000000000000000000000000000000006

Вы делаете это так, чтобы длина была кратна 32 байтам, но обычно я просто копирую пример и меняю конец, чтобы не нажимать кнопку 0 8 миллиардов раз.

Теперь, цитируя прямо из документов , мы имеем:

Комбинируя селектор функций и закодированный аргумент, наши данные будут такими:

0xc6888fa10000000000000000000000000000000000000000000000000000000000000006

Давай попробуем:

> curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' localhost:8545
{"id":8,"jsonrpc":"2.0","result":"0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74"}

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

Вызов с помощью скриптов Python

Я не тестировал ни один из них, но из комментариев ссылки для изучения включают:

Вы можете использовать инструмент 0xweb для чтения контракта и записи (отправки транзакций) в контракт.

$ npm i 0xweb -g

Затем вам нужно установить контракт от etherscan и других цепочек evm, но контракты должны быть проверены.

$ 0xweb install 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 --name USDC --chain eth 
$ 0xweb contract read USDC balanceOf --account 0x0a59649758aa4d66e25f08dd01271e891fe52199 --chain eth

Вы можете перечислить все доступные методы с необходимыми параметрами для установленного контракта по имени:

$ 0xweb contract abi USDC --chain eth