Обзор

Это пошаговое руководство по переносу вашего Ethereum Dapp на Hyperledger Fabric без изменения кода web3 😍.

Мы будем использовать первую сеть в качестве конфигурации сети с гиперссылкой и Fab3 в качестве прокси-службы. Давайте начнем!

Вот наш пример приложения, которое на данный момент использует смарт-контракт, развернутый на Ethereum.

pragma solidity ^0.5.0;
contract Greeter {
    string public greetings;
    
    constructor() public {
        greetings = "Hello from ethereum!";
    }
    
    function set( string memory newGreetings) public {
        greetings = newGreetings;
    }
    
    function greet() public view returns (string memory) {
        return greetings;
    }
}
//Our smart contract logic

Здесь вы можете найти полный репозиторий для нашего примера Dapp.

1. Создание сетевой инфраструктуры Hyperledger Fabric.

Мы начнем с настройки сети Hyperledger Fabric. Давайте создадим новый проект с именем dapp-migrate и загрузим в него образец репозитория, содержащий нашу сетевую конфигурацию из Hyperledger Foundation.

Мы поместим наши образцы файлов в структуру /src/github.com/hyperledger/, чтобы в дальнейшем нам не пришлось изменять файлы конфигурации fab3.

Обратите внимание, что я использую версию выпуска 1.4.

$ mkdir -p fabric-migarte/src/github.com/hyperledger
$ cd fabric-migrate/src/github.com/hyperledger
$ curl -sSL http://bit.ly/2ysbOFE | bash -s -- 1.4.1 1.4.1 0.4.15

По тому же пути клонируйте репозиторий fabric chaincode evm, который содержит EVM цепного кода (виртуальная машина Ethereum) и прокси-сервис под названием fab3,, который позволяет нам взаимодействовать со смарт-контрактами с помощью web3js. .

$ git clone https://github.com/hyperledger/fabric-chaincode-evm.git

Давайте перейдем к first-network внутри fabric-samples и изменим docker-compose-cli.yaml. Нам нужно сопоставить репозиторий fabric-chaincode-evm внутри нашего контейнера cli .

cli:
    volumes:
      - ./../../fabric-chaincode-evm:/opt/gopath/src/github.com/hyperledger/fabric-chaincode-evm

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

$ ./byfn.sh generate

После этого мы готовы запустить нашу сеть, выполнив команду up для файла byfn.sh. Это должно вызвать контейнеры докеров с одноранговыми узлами для двух организаций, например, для инструментов заказа и фабрики.

$ ./byfn.sh up

Когда все будет готово, перейдем в контейнер cli.

$ docker exec -ti cli bash

и внутри контейнера мы должны установить цепной код EVM

$ peer chaincode install -n evmcc -l golang -v 0 -p github.com/hyperledger/fabric-chaincode-evm/evmcc

Теперь мы собираемся создать экземпляр нашего цепного кода EVM на канале с именем mychannel, используя одноранговый узел по умолчанию для Org1.

$ peer chaincode instantiate -n evmcc -v 0 -C mychannel -c '{"Args":[]}' -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

2. Запустите прокси-службу Fab3.

Fab3 - это провайдер web3, который позволяет нам использовать инструменты Ethereum, такие как Web3.js и Remix IDE, для взаимодействия со смарт-контрактами Ethereum. Он был построен как частичная реализация Ethereum JSON RPC API.

Прежде всего, давайте экспортируем GOPATH переменную env с путем к каталогу проекта.

$ export GOPATH=/path/to/project/name

Fab3 требуется ряд переменных для определения параметров конфигурации. Нам нужно указать путь к файлу с файлом конфигурации, определяющим cryptoconfig, пиров и каналы.

С помощью переменных среды среди многих параметров, которые не требуют объяснений, мы также можем указать порт, который прослушивает наш прокси, выбрать целевого партнера и имя смарт-контракта, содержащего цепной код evm.

$ export FAB3_CONFIG=${GOPATH}/src/github.com/hyperledger/fabric-chaincode-evm/examples/first-network-sdk-config.yaml 
  export FAB3_USER=User1 
  export FAB3_ORG=Org1  # Organization of the specified user
  export FAB3_CHANNEL=mychannel 
  export FAB3_CCID=evmcc
  export FAB3_PORT=5000

С этими параметрами мы готовы сделать сервис Fab3 внутри локации репозитория evm.

$ make fab3

И запустите это

$ bin/fab3

Вуаля! Наша сеть Hyperledger готова взаимодействовать с вызовами web3.js 😍

3. Разверните и интегрируйте смарт-контракт с помощью web3js.

Итак, у нас есть приложение, которое содержит простые скрипты, которые развертывают смарт-контракты и изменяют значение приветствий.

Нашей целью было перейти с Ethereum на Hyperledger Fabric. У меня для вас хорошие новости. Единственное, что нам нужно изменить в нашем коде, - это адрес нашего веб-провайдера на 127.0.0.1:5000. Обратите внимание, что я использую web3 v. 1.0.0-beta.37.

Запускаем наш сценарий развертывания

$ node index.js

Давайте проверим, был ли наш смарт-контракт развернут в сети Hyperledger и можем ли мы с ним связываться.

Запустите команду peer chaincode query внутри нашего контейнера cli, где 1-й аргумент - это адрес нашего смарт-контракта без обозначения «Ox», а второй - хеш функции, взятый из Remix IDE.

$ peer chaincode query -n evmcc -C mychannel -c '{"Args":["60A6a849000C7a8aFC36088abAbE5013b647397D","cfae3217"]}'

Здорово! Теперь наш смарт-контракт развернут в сети Hyperledger.

Давайте выполним greet.js, который меняет приветствие с "Hello from ethereum!" на «Привет от Hyperledger Fabric!» и после этого вызывает функцию greet ().

$ node greet.js

Вернемся к контейнеру cli и еще раз выполним вызов функции greet.

$ peer chaincode query -n evmcc -C mychannel -c '{"Args":["60A6a849000C7a8aFC36088abAbE5013b647397D","cfae3217"]}'

На этом пока все, наше Dapp работает с Hyperledger Fabric без изменений в коде web3.js!

Пожалуйста, оставьте свои комментарии по поводу этого подхода и поделитесь тем, что вам удалось построить с помощью Fab3 и web3.js ✌️