Глава 3
____________________________________
[ 94 ]
___________________________________
Вы получите на выходе следующий код:
var proofContract =
web3.eth.contract([{"constant":false,"inputs":[{"name":"fileHash","type":"s
tring"}],"name":"get","outputs":[{"name":"timestamp","type":"uint256"},{"na
me":"owner","type":"string"}],"payable":false,"type":"function"},{"constant
":false,"inputs":[{"name":"owner","type":"string"},{"name":"fileHash","type
":"string"}],"name":"set","outputs":[],"payable":false,"type":"function"},{
"anonymous":false,"inputs":[{"indexed":false,"name":"status","type":"bool"}
,{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"na
me":"owner","type":"string"},{"indexed":false,"name":"fileHash","type":"str
ing"}],"name":"logFileAddedStatus","type":"event"}]);
var proof = proofContract.new(
{
from:
web3.eth.accounts[0],
data: '60606040526......,
gas:
4700000
}, function (e, contract){
console.log(e,
contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + '
transactionHash: ' + contract.transactionHash);
}
})
Блок
data
(выделен полужирным шрифтом) представляет собой байт-код (скомпи-
лированную версию контракта), который понятен виртуальной машине Ethereum.
Исходный код сначала конвертируется в операционный код (opcode, мнемониче-
ские коды операций), а затем в байт-код виртуальной машины. Каждый операцион-
ный код имеет связанный с ним газ.
Первый аргумент в
web3.eth.contract
— это определение ABI (Application Binary
Interface, двоичный интерфейс приложения). Определение ABI применяется при
создании транзакций и содержит объявление прототипов всех методов.
Теперь запустите Geth в режиме разработчика,
обязательно с включенным майнин-
гом
. Для этого введите в окне командной строки
12
:
geth --dev --mine --etherbase 'здесь подставьте ваш адрес Ethereum'
Откройте еще одно окно командной строки и введите команду запуска интерактив-
ной консоли JavaScript с подключением к работающему узлу:
geth attach
После этого консоль JavaScript должна подключиться к процессу, запущенному
в другом окне.
12
Новая версия Geth не запустит режим майнинга даже в отладочном режиме без указания вашего
адреса в опции
–etherbase
.
Разработка
смарт-контрактов
____________________________________
[ 95 ]
___________________________________
В правой панели браузера Solidity скопируйте содержимое текстового поля
web3
deploy
, вставьте его в интерактивную консоль и нажмите клавишу . Снача-
ла вы получите
хеш транзакции
, а после некоторого ожидания, которое займет
майнинг транзакции, вы получите
адрес контракта
. Каждый развернутый кон-
тракт имеет уникальный адрес, по которому определяется в блокчейне.
Адрес контракта определенным образом вычисляется из адреса создателя (адрес
from
) и количества отправленных транзакций (transaction nonce). Два этих числа
подвергаются RLP-кодированию
13
, а затем хешируются по алгоритму Keccak-256.
Мы рассмотрим понятие
transaction nonce
позже. Про RLP-кодирование можно
подробнее прочитать по адресу:
https://github.com/ethereum/wiki/wiki/RLP
.
Теперь давайте сохраним информацию о файле и запросим ее обратно.
Вставьте в консоль код из листинга 3.16, чтобы передать транзакцию сохранения
информации о файле.
Листинг 3.16. Код для отправки транзакции с данными файла
var contract_obj =
proofContract.at("0x9220c8ec6489a4298b06c2183cf04fb7e8fbd6d4");
contract_obj.set.sendTransaction("Owner Name",
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", {
from: web3.eth.accounts[0],
}, function(error, transactionHash){
if (!err)
console.log(transactionHash);
})
В этом листинге замените адрес контракта на адрес, который вы только что полу-
чили. Первый аргумент метода
proofContract.at()
— это и есть адрес контракта.
Здесь мы не указали количество газа, в таком случае это значение вычисляется
автоматически.
Теперь давайте извлечем информацию о файле. Введите в консоль этот код
14
:
contract_obj.get.call("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852
b855");
Вы получите следующий ответ:
[1477591434, "Owner Name"]
Метод
call()
применяется для вызова метода контракта из текущего расположения.
Он не транслирует транзакцию. Для чтения данных нам не требуется трансляция,
потому что у нас есть собственная копия блокчейна.
Более подробно о пакете библиотек web3.js вы узнаете в следующих главах.
13
Recursive Length Prefix, основной метод кодирования для сериализации объектов Ethereum
.
14
Вы можете скопировать хеш файла из листинга 3.16.
Do'stlaringiz bilan baham: |