Автор оригинала: Gabriel Saldanha.
В этом уроке мы напишем простой смарт-контракт, развернем его в личном блокчейне Ethereum и вызовем контракт из скрипта Python.
Что вам нужно установить, прежде чем мы продолжим:
- Python3 v3.5.3 или более поздней версии, у меня были некоторые проблемы с использованием версии 3.8, а затем я переключился на 3.5.3;
- NodeJS v8.9.4 или более поздней версии (для установки
трюфель
);
Полный код проекта доступен на GitHub
TOC
- Настройка проекта
- Написание смарт-контракта
- Развертывание смарт – контракта в блокчейне
- Вызов развернутого контракта
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. Развертывание смарт-контракта в блокчейне
Чтобы развернуть наш смарт-контракт в блокчейне, нам сначала нужно:
- сценарий миграции;
- блокчейн для развертывания контракта;
Для сценария миграции создайте файл с именем 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.