У меня есть кошелек Mist и контракт (с его адресом), который я выполняю из графического интерфейса Mist «вручную». Мне было интересно, как я могу выполнить его из командной строки (bash, а не geth) или вызвать это выполнение из скрипта Python. Если это возможно, не могли бы вы предоставить пример игрушки или дорожную карту? Заранее спасибо!
Все это уже было изучено в комментариях, но я резюмирую как ответ!
Это довольно подробно объясняется в Руководстве Homestead по доступу к контрактам и транзакциям .
С самых основ Ethereum имеет интерфейс RPC (удаленный вызов процедур), как прекрасно объясняется на странице RPC в Википедии . Интерфейс Ethereum RPC использует подмножество спецификации JSON-RPC 2.0 со следующими оговорками:
Используя интерфейс RPC, мы можем выполнять такие команды, как eth_coinbase
, которые возвращают ваш ETH-адрес:
> curl --data '{"jsonrpc":"2.0","method":"eth_coinbase", "id":1}' localhost:8545
Что печатает:
{"id":1,"jsonrpc":"2.0","result":["0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a"]}
Взаимодействие с функциями из предварительно развернутых контрактов осуществляется через сигнатуру их функции, которую можно найти, взяв первые 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"}
Поскольку мы отправили транзакцию, мы получили возвращенный хэш транзакции. У вас могут быть гораздо более интересные примеры, которые возвращают результаты вызовов функций.
Я не тестировал ни один из них, но из комментариев ссылки для изучения включают:
Вы можете использовать инструмент 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
Микко Отамаа
curl
командыМикко Отамаа
DonPresente
Микко Отамаа
DonPresente
Микко Отамаа
curl
это команда UNIX для bash. Извините, у меня есть только довольно сложные примеры Python. Документация Populus может иметь некоторые populus.readthedocs.io/en/latest/quickstart.htmlDonPresente
Микко Отамаа
конфиденциальностьisahumanright.eth
grep
и обрабатываетsed
только интересующие данные.DonPresente
DonPresente
q9f
Томас Джей Раш
echo "<insert command here>" | geth attach
. Это очень просто, и он возвращает результат в стандартный вид. Я часто используюcurl
, как указано выше.