Обзор
Это пошаговое руководство по переносу вашего 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 ✌️