在Hyperledger Fabric上部署以太坊智能合约

本篇文章的重点是我们将使用Fabric-Evm在Hyperledger架构网络上部署以太坊智能合约,并对以太坊智能合约进行跨平台检查。
构成组件
1.Hyperledger Fabric EVM
在Hyperledger架构peer上运行的自定义以太坊虚拟机
2.Fab3代理
EVM兼容区块链(Hyperledger)节点客户端,用于与节点进行交互。
3.Web3.js
一个用于与本地或远程区块链节点进行交互的javascript库。 在此项目场景中,它将与Fab3交互。
4.BYFN架构网络
一个简单的Byfn网络可让您创建以2个组织运行的Hyperledger Fabric网络,每个ORG具有两个peer。
工作流程
1.构建Fabric网络
2.将EVM安装在Fabric-peers上。
3.启动Fabric网络
4.安装和实例化EVM Chaincode
5.设置Fab3
6.部署Smartcontract。
先决条件
1.Go
安装Go并将其添加到您的路径
wget https://dl.google.com/go/go1.12.6.linux-amd64.tar.gz
sudo tar -xvf go1.12.6.linux-amd64.tar.gz
sudo mv go /usr/local
export GOROOT=/usr/local/go
export GOPATH=$HOME/go #choose your prferred work directory path
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
go version #check if it is installed correctly
2.node.js 和 Npm
sudo apt-get install nodejs
sudo apt-get install npm
3.Docker
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable”
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce
操作步骤
1.构建Fabric网络
将Fabric样本复制到$ GOPATH / src / github.com / hyperledger目录。 为此我们需要先创建目录,然后进行复制。
mkdir go
cd go
mkdir src
cd $GOPATH/src
mkdir github.com
cd github.com
mkdir hyperledger
cd hyperledger
git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples
git checkout release-1.4
文件架构
go
├─src
│  ├─github.com
│      │–hyperledger
             │–fabric-samples
             │–fabric-chaincode-evm
为fabric samples first网络下载docker的镜像
./scripts/bootstrap.sh
2.将EVM安装在Fabric-peers上
在GOPATH /目录中复制fabric-chaincode-evm到存储库。
cd $GOPATH/src/github.com/hyperledger/
git clone https://github.com/hyperledger/fabric-chaincode-evm
cd fabric-chaincode-evm
git checkout release-0.1
我们需要将fabric-chaincode-evm嵌入到我们的第一个网络docker映像中。为此请导航回fabric-samples / first-network目录。
cd $GOPATH/src/github.com/hyperledger/fabric-samples/first-network
使用存储卷更新docker-compose-cli.yaml以包含EVM。使用任何代码编辑器添加如下所示的EVM卷
cli:
    volumes:
      – ./../../fabric-chaincode-evm:/opt/gopath/src/github.com/hyperledger/fabric-chaincode-evm
3.启动fabric网络
生成证书并启动网络
./byfn.sh generate
./byfn.sh up
4.安装和实例化EVM Chaincode
现在我们需要在evm上安装并实例化chaincode。导航到docker容器的CLI
docker exec -it cli bash
添加网络所需的peer依赖项。
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=”Org1MSP”
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
在所有peer节点上安装并实例化Chaincode
peer chaincode install -n evmcc -l golang -v 0 -p github.com/hyperledger/
fabric-chaincode-evm/evmcc   #Installs Chain code
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
 #Instantiates Chaincode on all peers
exit
5.设置Fab3
执行以下操作来设置设置Fab3所需的某些环境变量。
export FABPROXY_CONFIG=${GOPATH}/src/github.com/hyperledger/
fabric-chaincode-evm/examples/first-network-sdk-config.yaml 
# Path to a compatible Fabric SDK Go config file
export FABPROXY_USER=User1 # User identity being used for the proxy 
(Matches the users names in the crypto-config directory specified in the
 config)
export FABPROXY_ORG=Org1 # Organization of the specified user
export FABPROXY_CHANNEL=mychannel # Channel to be used for the
transactions
export FABPROXY_CCID=evmcc # ID of the EVM Chaincode deployed in your 
fabric network
export PORT=5000 # Port the proxy will listen on. If not provided 
default is 5000.
现在导航回到fabric-chaincode-evm目录构建和运行代理
cd $GOPATH/src/github.com/hyperledger/fabric-chaincode-evm/
go build -o fab3 ./fabproxy/cmd #builds the proxy with predefined 
env variables
./fab3 #starts proxy on your host
现在您的Fabric网络已启动并在http//localhost:5000上运行,并准备部署Smartcotracts
6.部署智能合约
打开另一个终端,安装web3库
npm install [email protected]
创建您选择的工作目录。 在该目录上运行npm install以安装所需的npm模块。
现在我们将进入节点控制台以设置我们的web3。 在工作目录中的命令下面运行
node
分配Web3库并使用在上一个终端中运行的fab3作为提供程序
Web3 = require(‘web3’)
web3 = new Web3(new Web3.providers.HttpProvider(‘http://localhost:5000′))
要查看您的帐户信息,请运行
web3.eth.accounts
您会看到类似于以太坊的帐户地址。将此帐户分配为defaultAccount
web3.eth.defaultAccount = web3.eth.accounts[0]
现在您可以通过以与以太坊相似的方式指向Abi和bytecode来部署智能合约。在remix或truffle编制智能合约。为部署做好abi和bytecode准备。
abi=<paste abi here>
byteCode=<paste your Byte Code here>
contract= web3.eth.contract(abi)
deployedContract= contract.new([], { data: byteCode })
您可以使用如下所示的已部署智能合约的交易哈希获取智能合约地址

web3.eth.getTransactionReceipt(deployedContract.transactionHash)

在Hyperledger Fabric上部署以太坊智能合约

相关资料链接:
1. [Hyperledger Fabric EVM](https://github.com/hyperledger/fabric-chaincode-evm “Hyperledger Fabric EVM”)
2. [Fabric-samples](https://github.com/hyperledger/fabric-samples “Fabric-samples”)
3. [Hyperledger Fabric docs](https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html “Hyperledger Fabric docs”)
4. [IBM Hyperledger-Ethereum](https://github.com/IBM/vote-hyperledger-ethereum “IBM Hyperledger-Ethereum”)
5. [web3.js](https://web3js.readthedocs.io/en/1.0/ “web3.js”)