Рубрики
Без рубрики

[Часть 2/2] Сохранение данных в блокчейне Ethereum с помощью Python, Truffle и Ganache

Предыдущий пост (https://dev.to/gcrsaldanha/deploy-a-smart-contract-on-ethereum-with-python-truffle-and-web3py-5on) продемонстрировал, как написать простой смарт-контракт с Solidity и развернуть его…

Автор оригинала: Gabriel Saldanha.

Предыдущий пост продемонстрировал, как написать простой смарт-контракт с Solidity и развернуть его на блокчейне Ethereum. Этот учебник покажет, как обновить контракт, чтобы сохранить некоторые данные в блокчейне, а также как проверить блокчейн, чтобы увидеть наши транзакции.

Мы будем работать с теми же файлами из предыдущего урока, которые можно найти здесь .

Если вы не в настроении идти вместе с учебником, готовый код доступен здесь .

TOC

  1. Обновление нашего контракта
  2. Выполнение транзакции
  3. Проверка блокчейна с помощью Ганаша

1. Настройка проекта

Откройте файл HelloWorld.sol и добавьте следующее:

 pragma solidity >= 0.5.0;

 contract HelloWorld {
+    string public payload;
+
+    function setPayload(string memory content) public {
+        payload = content;
+    }
+
     function sayHello() public pure returns (string memory) {
         return 'Hello World!';
     }
 }

Как и раньше, раскрутите truffle local blockchain с truffle development CLI:

$ truffle develop
Truffle Develop started at http://127.0.0.1:9545/

Accounts:
(0) 0x55660bb0918f9aade4db7b7ef7f71639750c2262
...
Private Keys:
(0) ead0d6b318832f278b9a2ee1a6a6ab0156ab439d898394b6887d023bc929159c
...
$ truffle(develop)>

Теперь нам нужно обновить наш контракт, что под Truffles Suite выполняется с помощью команды migrate . Напишите migrate в консоли Truffles.

Compiling your contracts...
===========================
> Compiling ./contracts/HelloWorld.sol
> Compiling ./contracts/Migrations.sol
...
2_deploy_contracts.js
=====================

   Replacing 'HelloWorld'
   ----------------------
   > transaction hash:    0x6f55fc4a165225c6911d6e0acda8b4ec75b0962370eab66ab94aefd0e0cfd084
   > Blocks: 0            Seconds: 0
   > contract address:    0x85534E0ec31b63d635CcBa1fb6b953a9C47a9022
...

Контракт теперь обновляется с помощью открытого метода set Payload , развернутого по адресу 0x85534E0ec31b63d635CcBa1fb6b953a9C47a9022 (адрес контракта). Напишите этот адрес где-нибудь в другом месте, он нам скоро понадобится. Мы можем проверить, что контракт был правильно обновлен, извлекая экземпляр контракта и проверяя наличие метода setPayload , а также значение переменной payload :

# We're still inside Truffle's console
$ truffle(develop)> let instance = await HelloWorld.deployed()
$ truffle(develop)> instance.setPayload
[Function] {
  call: [Function],
  sendTransaction: [Function],
  estimateGas: [Function],
  request: [Function]
}
$ truffle(develop)> instance.payload.call()
''  # Empty, as expected!

2. Выполнение транзакции

Когда мы вызываем функцию, которая возвращает только значение , например say Hello , состояние блокчейна не изменяется. Поскольку теперь мы хотим сохранить значение в блокчейне, его состояние должно быть изменено, и это делается через транзакцию выполнение. Мы хотим выполнить эту транзакцию из нашего скрипта Python , того же самого, который мы использовали для вызова метода sayHello в предыдущем посте. Добавьте следующее в нижнюю часть app.py :

# executes setPayload function
tx_hash = contract.functions.setPayload('abc').transact()
# waits for the specified transaction (tx_hash) to be confirmed
# (included in a mined block)
tx_receipt = web3.eth.waitForTransactionReceipt(tx_hash)
print('tx_hash: {}'.format(tx_hash.hex()))

Кроме того, обновите deployed_contract_address in app.py с новым адресом контракта (вывод из migrate ). Если вы его не помните, вернитесь к консоли Truffle и вызовите instance.address .

В другом терминальном сеансе выполните наш скрипт Python:

python app.py
Hello World!
tx_hash: 0x2b7bf989fd0fc692d0ef976b3293c39958ab7de64a08a3f66c0d758b871ad8e6

Не весело, правда? Откуда мы знаем, что данные сохранились? Вернитесь к консоли Трюфеля и вызовите переменную полезная нагрузка :

$ truffle(develop)> instance.payload.call()
'abc'  # cool! It changed!

Это означает , что наша транзакция была добыта , таким образом, была добавлена в блок, который был успешно добавлен в блокчейн.

3. Проверка блокчейна с помощью ганаша

Существуют различные способы проверки блокчейна. Например, с помощью консоли Truffle:

# Fetch blockchain's latest mined block
$ truffle(develop)> block = await web3.eth.getBlock("latest")
$ truffle(develop)> block
{
  number: 6,  # YMMV
  (...)
  transactions: [
    '0x2b7bf989fd0fc692d0ef976b3293c39958ab7de64a08a3f66c0d758b871ad8e6'
  ]
}

transactions перечисляет все транзакции, которые были добавлены в этот блок. В этом случае есть одна транзакция, которая должна соответствовать tx_hash , которая была напечатана при запуске app.py .

Чтобы облегчить нашу жизнь, существует графический инструмент для проверки блокчейна и его транзакций: Ganache . Согласно их веб-сайту:

Быстро запустите личный блокчейн Ethereum, который вы можете использовать для запуска тестов, выполнения команд и проверки состояния, контролируя работу цепочки.

После успешной установки и открытия его вы должны увидеть следующее изображение: Выберите “Быстрый старт”, и вас встретит экран со списком некоторых учетных записей и их соответствующих адресов (очень похоже на то, как работает truffle development ). Там также будет RPC-сервер адрес, например http://127.0.0.1:8545 , запишите это. Нажмите кнопку “Сохранить” (верхний правый угол), чтобы сохранить это рабочее пространство Ганаша.

Начальный экран ганаша

При быстром запуске Ganache он создал для нас еще один локальный блокчейн. Теперь мы можем сказать truffle использовать блокчейн Ganache (который имеет приятный пользовательский интерфейс). Для этого откройте truffle-config.js и заменить его следующим:

module.exports = {
  networks: {
    development: {
      // host and port should match the RPC Server address
      // as seen in Ganache
      host: "127.0.0.1",
      port: 8545,
      network_id: "*"
    }
  }
};

Перейдите на вкладку Контракты и выберите Link Truffle Projects . Нажмите кнопку Добавить проект , затем выберите truffle-config.js файл из hello-корневой папки проекта /. Нажмите кнопку Сохранить и перезапустить в правом верхнем углу.

Добавить экран проекта Ганаша

Если вы сейчас перейдете на вкладку Контракты, то увидите два контракта:

  • Hello World: Не развернуто
  • Миграции: Не развернуты

Откройте другой сеанс терминала, перейдите на корневой уровень проекта (где truffle-config.js находится), и введите truffle migrate . Он развернет наши контракты в блокчейне Ганаша. Скопируйте адрес контракта HelloWorld и обновите адрес deployed_contract_address in app.py с его новым значением, а также переменной blockchain_address с http://127.0.0.1:8545 .

- blockchain_address = 'http://127.0.0.1:9545'  # truffle blockchain
+ blockchain_address = 'http://127.0.0.1:8545'  # ganache blockchain
- deployed_contract_address = '0x85534E0ec31b63d635CcBa1fb6b953a9C47a9022'
+ deployed_contract_address = '0x433D7E91B659CB4f1bbBb8dacd2B1cBBa7F82F1A'

Теперь на вкладке Контракты оба контракта ( HelloWorld и Migrations ) должны иметь адрес. Это значит, что они развернуты! у-у-у! Теперь беги app.py снова выполнить новую транзакцию на нашем новейшем блокчейне , а затем нажать на HelloWorld contract: Обратите внимание на ХЭШ TX , он должен быть таким же, как напечатан при запуске app.py .

Контракт HelloWorld, показывающий транзакции

А если нажать на саму транзакцию: , то можно увидеть как вызванную функцию, так и входные данные.

Отображение информации о транзакциях

Беги app.py еще несколько раз измените abc (in tx_hash.functions.setPayload('abc').transact() ) на что-то другое, а затем снова проверьте свой контракт. Теперь это ВАШ блокчейн, действуйте в соответствии с ним!

Обертывание

В этом уроке вы узнали, как:

  • Напишите метод, который изменяет состояние блокчейна;
  • Используйте Truffle CLI для взаимодействия с развернутым смарт – контрактом;
  • Используйте приложение Ganache как в качестве поставщика блокчейна, так и в качестве его инспектора;

Если что-то не ясно или есть какие-то предложения, пожалуйста, оставьте комментарий ниже!