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

[Часть 1/2] Развертывание смарт-контракта на Ethereum с Python, Truffle и web3py

В этом уроке мы напишем простой смарт-контракт, развернем его в личном блокчейне Ethereum и вызовем контракт из скрипта Python.

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

В этом уроке мы напишем простой смарт-контракт, развернем его в личном блокчейне Ethereum и вызовем контракт из скрипта Python.

Что вам нужно установить, прежде чем мы продолжим:

  • Python3 v3.5.3 или более поздней версии, у меня были некоторые проблемы с использованием версии 3.8, а затем я переключился на 3.5.3;
  • NodeJS v8.9.4 или более поздней версии (для установки трюфель );

Полный код проекта доступен на GitHub

TOC

  1. Настройка проекта
  2. Написание смарт-контракта
  3. Развертывание смарт – контракта в блокчейне
  4. Вызов развернутого контракта

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

Во-первых, давайте создадим папку для проекта:

$ mkdir hello-eth
$ cd hello-eth

Внутри hello-eth папка, установите трюфель :

npm install truffle
...
# You should something like this once the installation process is finished
+ truffle@5.1.25

Мы будем использовать инструмент truffle CLI для инициализации пустого проекта смарт – контракта:

$ ./node_modules/.bin/truffle init
# if truffle was installed globally (npm install -g truffle): $ truffle init

Приведенная выше команда создаст следующую структуру проекта:

  • контракты/ : Каталог для исходного кода контрактов солидности ( .sol файлы).
  • миграции/ : Каталог для файлов миграции контрактов.
  • test/ : Каталог для тестовых файлов. Это не будет рассмотрено в этом учебнике.
  • truffle.js : Файл конфигурации трюфеля.

контракты/ и миграции/ папки уже будут содержать Миграцию контракт и его сценарий развертывания ( 1_initial_migration.js ). Этот контракт используется компанией truffle для отслеживания миграции наших контрактов. Это не будет рассмотрено в этом уроке, так что не беспокойтесь об этом.

2. Написание смарт-контракта

Да, я буду использовать пример Hello World . Создайте файл с именем HelloWorld.sol внутри папки contracts/ и добавьте в него следующее содержимое:

pragma solidity >= 0.5.0 < 0.7.0;

contract HelloWorld {
    function sayHello() public pure returns (string memory) {
        return 'Hello World!';
    }
}

В корневой папке проекта используйте truffle для компиляции контракта:

$ ./node_modules/.bin/truffle compile  # or just truffle compile if installed globally...

Он выведет скомпилированный контракт HelloWorld.so as HelloWorld.json внутри build/contracts/ папка.

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

3. Развертывание смарт-контракта в блокчейне

Чтобы развернуть наш смарт-контракт в блокчейне, нам сначала нужно:

  1. сценарий миграции;
  2. блокчейн для развертывания контракта;

Для сценария миграции создайте файл с именем 2_deploy_contract.js внутри миграции/ папки и добавьте в нее следующее содержимое:

var HelloWorld = artifacts.require("HelloWorld");

module.exports = function(deployer) {
    deployer.deploy(HelloWorld);
};

Набор трюфелей содержит персональный блокчейн, который мы можем использовать для тестирования. Откройте терминал и запустите:

$ truffle develop

Вы должны увидеть результат, аналогичный следующему:

Truffle Develop started at http://127.0.0.1:9545/

Accounts:
(0) 0xdfb772fba7631b5bfde93cc3e2b0e488d1a17b2a
...
(9) 0x974779d6a98264043e8bb1c8b0cf93d9c7141a29

Private Keys:
...

truffle(develop)>

Теперь мы можем мигрировать наш контракт, который вызывает каждую миграцию в миграции/|/(по порядку), развертывая контракты в блокчейне.

truffle(develop)> migrate
Starting migrations...
...
2_deploy_contracts.js
=====================

   Deploying 'HelloWorld'
   ----------------------
   > transaction hash:    0xddc3dd045a7b6f70063303ff534d07e93c1dcb7a0a6c15e42fe281c7d2ab53e8
   > Blocks: 0            Seconds: 0
   > contract address:    0xb7afC8dB8EEf302cd30553B39cEa0599093FDE3C

адрес контракта – это адрес в сети Ethereum, на котором размещен этот экземпляр контракта. Сладко! Теперь у нас есть смарт-контракт, развернутый на нашем личном блокчейне Ethereum. Следующий шаг – вызвать его из скрипта Python.

4. Вызов развернутого контракта

В корневой папке проекта ( hello-the/ ) создайте файл с именем app.py со следующим содержанием (обратите внимание на комментарии, объясняющие сценарий):

import json
from web3 import Web3, HTTPProvider

# truffle development blockchain address
blockchain_address = 'http://127.0.0.1:9545'
# Client instance to interact with the blockchain
web3 = Web3(HTTPProvider(blockchain_address))
# Set the default account (so we don't need to set the "from" for every transaction call)
web3.eth.defaultAccount = web3.eth.accounts[0]

# Path to the compiled contract JSON file
compiled_contract_path = 'build/contracts/HelloWorld.json'
# Deployed contract address (see `migrate` command output: `contract address`)
deployed_contract_address = '0xb7afC8dB8EEf302cd30553B39cEa0599093FDE3C'

with open(compiled_contract_path) as file:
    contract_json = json.load(file)  # load contract info as JSON
    contract_abi = contract_json['abi']  # fetch contract's abi - necessary to call its functions

# Fetch deployed contract reference
contract = web3.eth.contract(address=deployed_contract_address, abi=contract_abi)

# Call contract function (this is not persisted to the blockchain)
message = contract.functions.sayHello().call()

print(message)

Теперь выполните следующие команды в терминале:

$ pip3 install web3
$ python3 app.py
> 'Hello World!'

Подведение итогов

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

  • Напишите простой смарт – контракт в солидности;
  • Создайте персональный блокчейн Ethereum для тестирования и разработки;
  • Развертывание контракта в блокчейне с помощью трюфеля ;
  • Вызовите функцию контракта из приложения Python.