Parity.exe
"Контракты"
«Разработать договор»
В окне "Новый контракт Solidity" написано:
/*
from here:
https://ethereum-homestead.readthedocs.io/en/latest/contracts-and-transactions/contracts.html#writing-a-contract
*/
contract HelloWorld {
event Print(string out);
function() { Print("Hello, World!"); }
}
Компиляция
Развертывать
И что?
Я застрял здесь (у меня нет бензина/денег на текущем счету)
Примечание. Оригинальный документ от Parity о контрактах мне неясен:
Parity Ethereum поддерживает государственное программирование смарт-контрактов с помощью языка программирования Solidity для блокчейна Ethereum. Кошелек содержит интегрированную среду разработки Solidity, позволяющую писать, компилировать и развертывать контракты.
Представление разработки контракта содержит панель кода контракта (слева) и параметры конфигурации (справа).
Чтобы начать работу с вашим первым контрактом, можно загрузить или импортировать существующие контракты.
Нашим первым контрактом будет Greeter "Hello, World!" договор:
pragma solidity ^0.4.11;
contract greeter {
address owner;
string message;
function greeter(string _message) public {
owner = msg.sender;
message = _message;
}
function say() constant returns (string) {
return message;
}
function die() {
if (msg.sender == owner) {
selfdestruct(owner);
}
}
}
Этот контракт содержит две переменные-члены, конструктор и две функции. Конструктор будет вызываться один раз при развертывании контракта, устанавливает владельца контракта в качестве отправителя транзакции и сохраняет предоставленное сообщение.
Константная функция say()
просто возвращает предоставленное сообщение при каждом вызове и die()
позволяет создателю контракта самостоятельно уничтожить контракт и очистить состояние.
Создадим контракт Greeter в интегрированной среде разработки Solidity. Обратите внимание, что для этого
pragma solidity ^0.4.11
требуется версия компилятора Solidity 0.4.11 или выше, которую можно выбрать справа.
Перед составлением контракта сохраним Greeter "Hello, world!" договор для последующего использования.
Теперь среда Parity Solidity позволяет компилировать байт-код, необходимый для развертывания в блокчейне, и генерировать двоичный интерфейс приложения (ABI), необходимый для взаимодействия с контрактами.
Удобная функция — оптимизация кода и автоматическая компиляция, повторно генерирующая байт-код и ABI по мере написания кода.
Выполнив эти шаги, Parity Ethereum предоставляет нам следующий интерфейс JSON (ABI), байт-код, метаданные и хэш роя.
Бинарный интерфейс приложения (ABI):
[
{
"constant":false,
"inputs":[
],
"name":"die",
"outputs":[
],
"payable":false,
"type":"function"
},
{
"constant":true,
"inputs":[
],
"name":"say",
"outputs":[
{
"name":"",
"type":"string"
}
],
"payable":false,
"type":"function"
},
{
"inputs":[
{
"name":"_message",
"type":"string"
}
],
"payable":false,
"type":"constructor"
}
]
Скомпилированный байт-код:
0x6060604052341561000c57fe5b604051610307380380610307833981016040528051015b60008054600160a060020a03191633600160a060020a03161790558051610051906001906020840190610059565b505b506100f9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009a57805160ff19168380011785556100c7565b828001600101855582156100c7579182015b828111156100c75782518255916020019190600101906100ac565b5b506100d49291506100d8565b5090565b6100f691905b808211156100d457600081556001016100de565b5090565b90565b6101ff806101086000396000f300606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166335f469948114610045578063954ab4b214610057575bfe5b341561004d57fe5b6100556100e7565b005b341561005f57fe5b610067610129565b6040805160208082528351818301528351919283929083019185019080838382156100ad575b8051825260208311156100ad57601f19909201916020918201910161008d565b505050905090810190601f1680156100d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101265760005473ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b6101316101c1565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156101b65780601f1061018b576101008083540402835291602001916101b6565b820191906000526020600020905b81548152906001019060200180831161019957829003601f168201915b505050505090505b90565b604080516020810190915260008152905600a165627a7a72305820bcb6dac55886f2319f381c72002482234ee43206c088e0eea076260a472d83230029
Метаданные контракта:
{
"compiler":{
"version":"0.4.11+commit.68ef5810"
},
"language":"Solidity",
"output":{
"abi":[
{
"constant":false,
"inputs":[
],
"name":"die",
"outputs":[
],
"payable":false,
"type":"function"
},
{
"constant":true,
"inputs":[
],
"name":"say",
"outputs":[
{
"name":"",
"type":"string"
}
],
"payable":false,
"type":"function"
},
{
"inputs":[
{
"name":"_message",
"type":"string"
}
],
"payable":false,
"type":"constructor"
}
],
"devdoc":{
"methods":{
}
},
"userdoc":{
"methods":{
}
}
},
"settings":{
"compilationTarget":{
"GreeterHelloWorld":"greeter"
},
"libraries":{
},
"optimizer":{
"enabled":true,
"runs":200
},
"remappings":[
]
},
"sources":{
"GreeterHelloWorld":{
"keccak256":"0xe8f8f27c4b8e16a9d3b488f689b9e3018d25bdee6a67734444c9bbbf7a59c731",
"urls":[
"bzzr://ed1e3e9a69578ad5ccc4bb33539f802ee94b243163491f6ee3f9456b0ae4d281"
]
}
},
"version":1
}
Рой хэш:
bcb6dac55886f2319f381c72002482234ee43206c088e0eea076260a472d8323
Эта информация важна для развертывания вашего смарт-контракта в блокчейне Ethereum и интеграции в ваши децентрализованные приложения. Сохраните их для дальнейшего использования.
Кстати, если вы предпочитаете использовать командную строку и у вас установлен компилятор Solidity, то же самое можно сделать, выполнив следующую команду, предполагая, что ваш код контракта сохранен в файле с именем greeter.sol
:
solc --optimize --abi --bin --metadata greeter.sol
======= greeter.sol:greeter =======
Binary:
6060604052341561000c57fe5b604051610307380380610307833981016040528051015b60008054600160a060020a03191633600160a060020a03161790558051610051906001906020840190610059565b505b506100f9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009a57805160ff19168380011785556100c7565b828001600101855582156100c7579182015b828111156100c75782518255916020019190600101906100ac565b5b506100d49291506100d8565b5090565b6100f691905b808211156100d457600081556001016100de565b5090565b90565b6101ff806101086000396000f300606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166335f469948114610045578063954ab4b214610057575bfe5b341561004d57fe5b6100556100e7565b005b341561005f57fe5b610067610129565b6040805160208082528351818301528351919283929083019185019080838382156100ad575b8051825260208311156100ad57601f19909201916020918201910161008d565b505050905090810190601f1680156100d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101265760005473ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b6101316101c1565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156101b65780601f1061018b576101008083540402835291602001916101b6565b820191906000526020600020905b81548152906001019060200180831161019957829003601f168201915b505050505090505b90565b604080516020810190915260008152905600a165627a7a7230582033ca9aeef924a814a80886e9f27b539e8c3b71780e6da527ebcd4df6076c45000029
Metadata:
{"compiler":{"version":"0.4.11+commit.68ef5810"},"language":"Solidity","output":{"abi":[{"constant":false,"inputs":[],"name":"die","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"inputs":[{"name":"_message","type":"string"}],"payable":false,"type":"constructor"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"greeter.sol":"greeter"},"libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"greeter.sol":{"keccak256":"0x2914014e6c5ef4ffd0de42461548cfb78b006af718a3ddf18c9fb851ba457854","urls":["bzzr://622e562f0f51d94c6bd395063133657d178c6c5c7bfd43db6c10470f59eb34ac"]}},"version":1}
Contract JSON ABI
[{"constant":false,"inputs":[],"name":"die","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"inputs":[{"name":"_message","type":"string"}],"payable":false,"type":"constructor"}]
Обратите внимание, что хэш роя кодируется в urls
поле метаданных при использовании solc
.
Теперь мы, наконец, хотим развернуть наш контракт, нажмите кнопку Deploy .
Контракты приветствующих могут быть развернуты непосредственно из Parity.
Выберите строку, которая приветствует вас.
После развертывания и добычи...
... контракт становится доступным в вашем кошельке Parity Ethereum и обеспечивает базовое взаимодействие.
Используйте интерфейс контракта, чтобы запросить
say
функцию и немедленно проверить результаты.
Чтобы развернуть контракт через JSON-RPC API, нам сначала нужно оценить требования к газу с помощью eth_estimateGas
вызова RPC, передав скомпилированный байт-код.
curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x00a329c0648769a73afac7f9381e08fb43dbea72", "data": "0x6060604052341561000c57fe5b6040516103aa3803806103aa833981016040528080518201919050505b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060019080519060200190610080929190610088565b505b5061012d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100c957805160ff19168380011785556100f7565b828001600101855582156100f7579182015b828111156100f65782518255916020019190600101906100db565b5b5090506101049190610108565b5090565b61012a91905b8082111561012657600081600090555060010161010e565b5090565b90565b61026e8061013c6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806335f4699414610046578063954ab4b214610058575bfe5b341561004e57fe5b6100566100f1565b005b341561006057fe5b610068610185565b60405180806020018281038252838181518152602001915080519060200190808383600083146100b7575b8051825260208311156100b757602082019150602081019050602083039250610093565b505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561018257600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b61018d61022e565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102235780601f106101f857610100808354040283529160200191610223565b820191906000526020600020905b81548152906001019060200180831161020657829003601f168201915b505050505090505b90565b6020604051908101604052806000815250905600a165627a7a72305820d7c4be18c8e86dd70b00aa0b072cde72893fcaafc766ff7bb86debf4d9357cac00290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001048656c6c6f2c20457468657265756d2100000000000000000000000000000000"}], "id": 1}' -H "Content-Type: application/json" -X POST localhost:8545
{"jsonrpc":"2.0","result":"0x4414b","id":1}
Теперь, когда мы знаем, что развертывание контракта будет стоить 278859 газа (hex 0x4414b
), мы можем транслировать транзакцию:
curl --data '{"method":"eth_sendTransaction","params":[{"from":"0x00a329c0648769a73afac7f9381e08fb43dbea72","gas":"0x4414b","data":"0x6060604052341561000c57fe5b6040516103aa3803806103aa833981016040528080518201919050505b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060019080519060200190610080929190610088565b505b5061012d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100c957805160ff19168380011785556100f7565b828001600101855582156100f7579182015b828111156100f65782518255916020019190600101906100db565b5b5090506101049190610108565b5090565b61012a91905b8082111561012657600081600090555060010161010e565b5090565b90565b61026e8061013c6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806335f4699414610046578063954ab4b214610058575bfe5b341561004e57fe5b6100566100f1565b005b341561006057fe5b610068610185565b60405180806020018281038252838181518152602001915080519060200190808383600083146100b7575b8051825260208311156100b757602082019150602081019050602083039250610093565b505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561018257600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b61018d61022e565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102235780601f106101f857610100808354040283529160200191610223565b820191906000526020600020905b81548152906001019060200180831161020657829003601f168201915b505050505090505b90565b6020604051908101604052806000815250905600a165627a7a72305820d7c4be18c8e86dd70b00aa0b072cde72893fcaafc766ff7bb86debf4d9357cac00290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001048656c6c6f2c20457468657265756d2100000000000000000000000000000000"}],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545
{"jsonrpc":"2.0","result":"0x9f79dbaeab3f0e24bbe2c885432dae3ff4350e357a497e7bf8820a64c219e011","id":1}
Обратите внимание: если учетная запись еще не разблокирована, вам необходимо переключиться на пользовательский интерфейс кошелька и подтвердить транзакцию с доверенным подписывающим лицом.
Теперь вы понимаете суть написания, компиляции и развертывания контрактов в цепочке Ethereum и знаете, как вызвать say()
функцию нашего развернутого контракта Greeter.
Есть два разных способа взаимодействия со смарт-контрактами в блокчейне Ethereum. Вы можете либо вызвать (запросить), либо вызвать (выполнить) контракт. Вызов контракта является процессом только для чтения и обычно бесплатен. Вызов контракта требует широковещательной передачи транзакции для выполнения функций желаемого контракта и должен быть покрыт комиссией. Итак, давайте выполним наш контракт с Greeter. Есть только одна функция, которая может быть выполнена: die()
.
Обычно хорошей практикой является очистка после разработки. Теперь, когда мы знаем, что наш разработанный контракт Greeter работает, мы собираемся удалить его из блокчейна, вызвав функцию die , которая самоуничтожает контракт.
После майнинга функция самоуничтожения освободит место из текущего состояния блокчейна.
Поскольку взаимодействовать с убитым контрактом невозможно, удалим его, нажав кнопку « Забыть » .
Чтобы выполнить die()
функцию через RPC, нам сначала нужно найти сигнатуру функции. Это можно сделать через solc --hash
:
$ solc --hash greeter.sol
======= greeter.sol:greeter =======
Function signatures:
35f46994: die()
954ab4b2: say()
Теперь все, что нам нужно сделать, это создать транзакцию для нашего контракта Greeter 0x1A3E28181B5043aC359B1146a8CCcce2a950212b
с загрузкой данных 0x35f46994
. Вызов самоуничтожения обычно не требует больших затрат, поэтому мы просто предполагаем небольшую сумму 0xc350
.
curl --data '{"method":"eth_sendTransaction","params":[{"from":"0x00a329c0648769a73afac7f9381e08fb43dbea72",to:"0x1A3E28181B5043aC359B1146a8CCcce2a950212b","gas":"0xc350","data":"0x35f46994"}],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545
{"jsonrpc":"2.0","result":"0x8423e6ed270f92621c14302f0d3db647eaf9677ef8f2ba0dd3374b79d2567c78","id":1}
Надеюсь, это прямо отвечает на ваш вопрос. Я предпочитаю контракт Greeter, потому что он может умереть . Но вы поймете идею и сможете адаптировать ее, чтобы ваш контракт HelloWorld работал.