主页 > imtoken最新版本 > Hyperledger Fabric 如何通过虚拟机部署以太坊智能合约

Hyperledger Fabric 如何通过虚拟机部署以太坊智能合约

imtoken最新版本 2023-04-07 05:22:29

EVM 作为用户链代码安装到 Fabric 中,然后可以通过它部署智能合约。 单个 EVM 链代码足以在一个通道上运行多个以太坊智能合约。 Chaincode 没有使用以太坊的共识方法。 所有交易仍将遵循 Fabric 交易流程中的执行、订购、验证步骤。 确保不同组织中有足够多的节点安装了链代码,并设置一个确保一定程度分散化的背书策略。为了与已部署的智能合约进行交互,有一个 fab3 从以太坊 JSON RPC API 中实现了一组有限的 API,因此可以用作 web3 提供者

EVM 作为用户链代码安装到 Fabric 中,然后可以通过它部署智能合约。 单个 EVM 链代码足以在一个通道上运行多个以太坊智能合约。 Chaincode 没有使用以太坊的共识方法。 所有交易仍将遵循 Fabric 交易流程中的执行、订购、验证步骤。 确保不同组织中有足够的节点安装了链代码,并设置背书策略以确保一定程度的去中心化。 为了与部署的智能合约进行交互,有“fab3”,它从以太坊 JSON RPC API 中实现了一组有限的 API,因此可以用作 web3 提供程序。

安装 EVM 链代码

EVM 链代码位于 evmcc 下的 repo fabric-chaincode-evm 中。 要安装链代码,请按照正常步骤安装链代码。 以下说明基于fabric-samples中的first-network教程1.3版本。

挂载 EVM 链码

使用卷更新 docker-compose-cli.yaml 以包含 fabric-chaincode-evm。

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

通过运行启动网络:

  ./byfn up

构建并启动 EVM

  docker exec -it cli bash

如果成功,您应该会看到以下提示:

  root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#

要更改目标对等点,请更改以下环境变量:

  # Environment variables for PEER0
  export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/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

接下来在所有节点上安装 EVM 链码:

以太坊合约怎么做_以太坊智能合约的众筹_以太坊合约地址查询

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

实例化 evmcc 并替换为通道名称

    peer chaincode instantiate -n evmcc -v 0 -C <channel-name> -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

与 EVM 链码交互

与 EVM Chaincode 交互的一般方法有两种:常用的 Fabric 工具和 Web3

使用对等 CLI

一般来说,evm需要两个参数,即以太坊交易中需要的address和input。

下面是部署简单存储合约并与之交互的示例。

部署合约

部署智能合约,to字段为零地址,输入为编译后的合约evm字节码。

  peer chaincode invoke -n evmcc -C <channel-name>  -c '{"Args":["0000000000000000000000000000000000000000","608060405234801561001057600080fd5b5060df8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b348015605957600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b348015608357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058203dbaed52da8059a841ed6d7b484bf6fa6f61a7e975a803fdedf076a121a8c4010029"]}' -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

此交易的有效负载将是您已部署合约的合约地址。 要验证您的合约是否已成功部署,您可以在 evmcc 中查询合约的运行时字节码:

  peer chaincode query -n evmcc -C <channel-name> -c '{"Args":["getCode",""]}'

此查询的有效负载应返回运行时字节码,它应如下所示:

  6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b348015605957600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b348015608357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058203dbaed52da8059a841ed6d7b484bf6fa6f61a7e975a803fdedf076a121a8c4010029

#### 与部署的合约交互

要与已部署的智能合约进行交互,您需要使用您在上一节中收到的合约地址。

简单存储合约有两个函数,set(x) 和 get()。 在这些交易中,to 字段是合约地址,input 字段是与任何必需参数连接的函数哈希。

我们首先设置存储值。 set 的函数散列是 60fe47b1,我们想将值设置为 10以太坊合约怎么做,那么我们需要将散列与 000000000000000000000000000000000000000000000000000000000a 连接起来。

  peer chaincode invoke -n evmcc -C <channel-name> -c '{"Args":["","60fe47b1000000000000000000000000000000000000000000000000000000000000000a"]}' -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

以太坊智能合约的众筹_以太坊合约怎么做_以太坊合约地址查询

现在要验证函数是否被调用,我们可以通过使用函数 hash6d4ce63c 运行 get 来查询值。

  peer chaincode query -n evmcc -C <channel-name> -c '{"Args":["","6d4ce63c"]}' --hex

此查询的输出应产生 a 的有效负载。

#### 获取用户账号地址

由于 Fabric 不使用用户帐户,因此没有用户帐户信息作为 EVM CC 的一部分存储。 但是我们确实有一种机制可以从用户的公钥生成用户帐户地址。 这在需要时用于 EVMCC 交易。 我们还提供机制信息,用户可以根据需要访问地址。

  peer chaincode query -n evmcc -C <channel-name> -c '{"Args":["account"]}'

有效负载将是您的用户地址。

使用 Web3

Web3.js 是一个库,可以改善部署和管理 EVM 智能合约的用户体验。 它需要一个已经实现了以太坊 JSON RPC API 的接口。 Fab Proxy 支持有限的 API,允许 web3. 以下操作不应在 cli docker 容器中执行。 它应该在您想要运行代理的地方之外完成。

设置 Fab 代理

Fabric 代理使用 Fabric Go SDK 连接 Fabric 网络并与之交互。 首先,您需要一个 SDK 配置。 此配置适用于第一个网络示例。 该配置假定 fabric-samples 存储库位于您的 $GOPATH 中,并且您的所有证书都位于 first-network 示例的默认位置。

代理依赖一组环境变量来工作。

  # Environment Variables for Fab3:
  export FAB3_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 FAB3_USER=User1 # User identity being used for the proxy (Matches the users names in the crypto-config directory specified in the config)
  export FAB3_ORG=Org1  # Organization of the specified user
  export FAB3_CHANNEL=mychannel # Channel to be used for the transactions
  export FAB3_CCID=evmcc # ID of the EVM Chaincode deployed in your fabric network. If not provided default is evmcc.
  export FAB3_PORT=5000 # Port the proxy will listen on. If not provided default is 5000.

在运行代理程序之前设置所需的变量。

建立 Fab 代理

以太坊合约地址查询_以太坊合约怎么做_以太坊智能合约的众筹

代理可以像任何其他 Go 项目一样构建。 确保你是这个 repo 的来源,这个 repo 在你的 gopath 上。

  go build -o fab3 ./fab3/cmd

您应该会看到一个二进制 fab3。 如果已设置所需的环境变量,则可以运行代理。

  ./fab3

如果使用默认端口,您应该会看到类似在端口 5000 上启动 Fab 代理的输出。

连接到代理

以下说明需要安装 node 和 web3。 说明按照 web3 api 版本 0.20.2 安装相同版本的 web3 运行:

npm install web3@0.20.2

安装正确版本的 web3 后,在节点会话中运行以下命令以连接到代理:

  > Web3 = require('web3')
  ...
  > web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:5000'))

如果成功,您应该能够获得您的帐户地址。 由于 SDK 使用发现服务来查找网络上的所有对等点,因此使用代理运行的第一个查询或事务将比其他的花费更长的时间。

  > web3.eth.accounts

您应该会看到一个包含您的帐户地址的元素数组。 为了运行任何交易,web3 需要设置 web3.eth.defaultAccount:

  > web3.eth.defaultAccount = web3.eth.accounts[0]

部署智能合约

对于使用 web3 部署合约的以太坊风格,这个过程应该很熟悉。 对于这个例子,我们将使用简单存储合约。

您需要编译的 evm 字节码和合约的 ABI 才能继续。

以太坊智能合约的众筹_以太坊合约怎么做_以太坊合约地址查询

  > simpleStorageABI = [
  	{
  		"constant": false,
  		"inputs": [
  			{
  				"name": "x",
  				"type": "uint256"
  			}
  		],
  		"name": "set",
  		"outputs": [],
  		"payable": false,
  		"stateMutability": "nonpayable",
  		"type": "function"
  	},
  	{
  		"constant": true,
  		"inputs": [],
  		"name": "get",
  		"outputs": [
  			{
  				"name": "",
  				"type": "uint256"
  			}
  		],

以太坊合约怎么做_以太坊合约地址查询_以太坊智能合约的众筹

"payable": false, "stateMutability": "view", "type": "function" } ] > simpleStorageBytecode = '608060405234801561001057600080fd5b5060df8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b348015605957600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b348015608357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058203dbaed52da8059a841ed6d7b484bf6fa6f61a7e975a803fdedf076a121a8c4010029' > SimpleStorage = web3.eth.contract(simpleStorageABI) > deployedContract = SimpleStorage.new([], {data: simpleStorageBytecode}) > myContract = SimpleStorage.at(web3.eth.getTransactionReceipt(deployedContract.transactionHash).contractAddress)

与之前部署的合约交互

如果你已经部署了一个简单的存储合约,你可以使用合约地址来创建一个合约实例。 下面假设您已经使用 SimpleStorageABI 创建了一个简单的存储对象类型。

  > myContract = SimpleStorage.at()

现在以太坊合约怎么做,我们可以通过将值设置为 10 来与合约进行交互。

  > myContract.set(10)

要验证交易是否有效,您可以通过运行 get() 来查询设置的值。

  > myContract.get().toNumber()

结果将返回 10

如果您想尽快学习课程,请访问Fabric区块链开发详解。 本课程针对初学者。 内容包括Hyperledger Fabric身份证书和MSP服务、权限策略、通道配置和启动、链码通信接口等核心概念。 Fabric网络设计、nodejs链码和应用开发的操作实践,是Nodejs工程师学习Fabric区块链开发的最佳选择。

================================================ == =====================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程: