Hyperledger Fabric如何通過虛擬機(jī)kvm部署以太坊智能合約

EVM作為用戶鏈代碼安裝到Fabric中,然后可以通過它部署智能合約儿倒。單個(gè)EVM鏈代碼足以在通道上運(yùn)行多個(gè)以太坊智能合約晾嘶。鏈碼不采用以太坊的共識(shí)方法。所有事務(wù)仍將遵循Fabric事務(wù)流中的執(zhí)行炮温,訂單,驗(yàn)證步驟颊艳。確保在不同組織中的足夠?qū)Φ确桨惭b鏈代碼茅特,并設(shè)置一個(gè)確保一定程度的分散的認(rèn)可政策。為了與已部署的智能合約進(jìn)行交互棋枕,有一個(gè)fab3白修,它從以太坊JSON RPC API實(shí)現(xiàn)一組有限的API,因此可以用作web3提供者

EVM作為用戶鏈代碼安裝到Fabric中重斑,然后可以通過它部署智能合約兵睛。 單個(gè)EVM鏈代碼足以在通道上運(yùn)行多個(gè)以太坊智能合約。 鏈碼不采用以太坊的共識(shí)方法窥浪。 所有事務(wù)仍將遵循Fabric事務(wù)流中的執(zhí)行祖很,訂單,驗(yàn)證步驟漾脂。 確保在不同組織中的足夠?qū)Φ确桨惭b鏈代碼假颇,并設(shè)置一個(gè)確保一定程度的分散的認(rèn)可政策。 為了與已部署的智能合約進(jìn)行交互骨稿,有一個(gè)“fab3”笨鸡,它從以太坊JSON RPC API實(shí)現(xiàn)一組有限的API,因此可以用作web3提供者坦冠。

安裝 EVM 鏈代碼

EVM鏈代碼位于evmcc下的repo fabric-chaincode-evm形耗。要安裝鏈碼,請按照常規(guī)步驟安裝鏈碼辙浑。以下說明基于fabric-samplesfirst-network教程的1.3版激涤。

掛載EVM Chaincode

用volumes更新docker-compose-cli.yaml以包含fabric-chaincode-evm

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

通過運(yùn)行啟動(dòng)網(wǎng)絡(luò):

  ./byfn up

構(gòu)建并啟動(dòng)EVM

  docker exec -it cli bash

如果成功判呕,你應(yīng)該看到以下提示:

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

要更改目標(biāo)對等方倦踢,請更改以下環(huán)境變量:

  # 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

接下來在所有對等設(shè)備上安裝EVM鏈代碼:

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

實(shí)例化evmcc并用頻道名稱替換<channel-name>

    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 Chaincode交互

有兩種與EVM Chaincode交互的通用方法:通常的Fabric工具和Web3

使用Peer CLI

一般來說送滞,evm需要兩個(gè)參數(shù),即to地址和在以太坊交易中必需的input硼一。

以下是與Simple Storage合約進(jìn)行部署和交互的示例累澡。

部署合約

要部署智能合約,to字段是零地址般贼,input是合約編譯后的evm字節(jié)碼。

  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

該交易的有效負(fù)載將是你已部署合約的合約地址奥吩。要驗(yàn)證你的合約是否已成功部署哼蛆,你可以在evmcc中查詢合約的運(yùn)行時(shí)字節(jié)碼:

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

該查詢的有效負(fù)載應(yīng)返回運(yùn)行時(shí)字節(jié)碼,該字節(jié)碼應(yīng)如下所示:

  6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b348015605957600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b348015608357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058203dbaed52da8059a841ed6d7b484bf6fa6f61a7e975a803fdedf076a121a8c4010029

與已部署的合約進(jìn)行交互

要與已部署的智能合約進(jìn)行交互霞赫,你需要使用上一節(jié)中收到的合約地址腮介。

Simple Storage Contract有兩個(gè)函數(shù),set(x)get()端衰。在這些交易中叠洗,to字段是合約地址和input字段是與任何必需參數(shù)連接的函數(shù)哈希。

我們先設(shè)置存儲(chǔ)的值旅东。set的函數(shù)哈希是60fe47b1灭抑,我們想要將值設(shè)置為10然后我們需要將哈希與000000000000000000000000000000000000000000000000000000000000000a連接起來。

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

現(xiàn)在要驗(yàn)證函數(shù)是否被調(diào)用抵代,我們可以通過運(yùn)行具有函數(shù)hash6d4ce63cget來查詢該值腾节。

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

該查詢的輸出應(yīng)該產(chǎn)生a的有效載荷。

獲取用戶帳戶地址

由于Fabric不使用用戶帳戶荤牍,因此作為EVM CC的一部分案腺,不存儲(chǔ)用戶帳戶信息。但是我們確實(shí)有一種生成機(jī)制來自用戶公鑰的用戶帳戶地址康吵。這在需要時(shí)用于EVMCC交易劈榨。我們還提供機(jī)制信息用戶可以根據(jù)需要訪問該地址。

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

有效負(fù)載將是您的用戶地址晦嵌。

使用Web3

Web3.js是一個(gè)庫同辣,可以改善部署和管理EVM智能合約的用戶體驗(yàn)。它期望已經(jīng)實(shí)現(xiàn)以太坊JSON RPC API的接口耍铜。Fab Proxy支持有限的API邑闺,允許使用web3。不應(yīng)在cli docker容器中執(zhí)行以下操作棕兼。它應(yīng)該在你想要運(yùn)行代理的地方之外完成陡舅。

設(shè)置Fab代理

Fabric代理使用Fabric Go SDK連接并與Fabric網(wǎng)絡(luò)交互。首先伴挚,你需要一個(gè)SDK配置靶衍。此config將適用于第一個(gè)網(wǎng)絡(luò)示例灾炭。配置假設(shè)fabric-samples repo 在你的$ GOPATH中,你的所有證書都在first-network例子的默認(rèn)位置颅眶。

代理依賴于一組環(huán)境變量來工作蜈出。

  # 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.

在運(yùn)行代理之前設(shè)置所需的變量。

構(gòu)建Fab代理

代理可以像其他go項(xiàng)目一樣構(gòu)建涛酗。確保你是這個(gè)repo的來源铡原,repo在你的gopath。

  go build -o fab3 ./fab3/cmd

你應(yīng)該看到一個(gè)二進(jìn)制fab3商叹。如果已設(shè)置所需的環(huán)境變量燕刻,則可以運(yùn)行代理。

  ./fab3

如果使用默認(rèn)端口剖笙,你應(yīng)該看到輸出如在端口5000上啟動(dòng)Fab代理卵洗。

連接到代理

以下說明需要安裝nodeweb3。指令遵循web3 api版本0.20.2安裝相同版本的web3運(yùn)行:

npm install web3@0.20.2

安裝正確版本的web3后弥咪,在節(jié)點(diǎn)會(huì)話中運(yùn)行以下命令連接到代理:

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

如果成功过蹂,你應(yīng)該能夠獲得你的帳戶地址。由于SDK使用發(fā)現(xiàn)服務(wù)來查找網(wǎng)絡(luò)上的所有對等方聚至,因此使用代理運(yùn)行的第一個(gè)查詢或交易將比其他查詢或交易花費(fèi)更長的時(shí)間酷勺。

  > web3.eth.accounts

你應(yīng)該看到一個(gè)包含你帳戶地址的元素?cái)?shù)組。為了運(yùn)行任何交易晚岭,web3需要設(shè)置web3.eth.defaultAccount

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

部署智能合約

對于使用web3部署合約的以太坊風(fēng)格鸥印,此過程應(yīng)該很熟悉。對于此示例坦报,我們將使用Simple Storage合約库说。

你需要編譯的evm字節(jié)碼和合約的ABI才能繼續(xù)。

  > 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)

與以前部署的合約交互

如果你已經(jīng)部署了簡單存儲(chǔ)合約片择,則可以使用合約地址創(chuàng)建合約實(shí)例潜的。以下假設(shè)你已使用SimpleStorageABI創(chuàng)建了簡單存儲(chǔ)對象類型。

  > myContract = SimpleStorage.at(<contract-address>)

現(xiàn)在字管,我們可以通過將值設(shè)置為10來與合約進(jìn)行交互啰挪。

  > myContract.set(10)

要驗(yàn)證交易是否有效,你可以通過運(yùn)行get()來查詢值集嘲叔。

  > myContract.get().toNumber()

結(jié)果將返回10

希望盡快學(xué)習(xí)課程的請?jiān)L問Fabric區(qū)塊鏈開發(fā)詳解亡呵,本課程面向初學(xué)者,內(nèi)容即包含Hyperledger Fabric的身份證書與MSP服務(wù)硫戈、權(quán)限策略锰什、通道配置與啟動(dòng)、鏈碼通信接口等核心概念,也包含F(xiàn)abric網(wǎng)絡(luò)設(shè)計(jì)汁胆、nodejs鏈碼與應(yīng)用開發(fā)的操作實(shí)踐梭姓,是Nodejs工程師學(xué)習(xí)Fabric區(qū)塊鏈開發(fā)的最佳選擇。

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

分享一些以太坊嫩码、EOS誉尖、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實(shí)戰(zhàn)教程:

  • EOS教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā)铸题,內(nèi)容涵蓋EOS工具鏈铡恕、賬戶與錢包、發(fā)行代幣回挽、智能合約開發(fā)與部署没咙、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開發(fā)千劈。
  • java以太坊開發(fā)教程,主要是針對java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j詳解牌捷。
  • python以太坊墙牌,主要是針對python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。
  • php以太坊暗甥,主要是介紹使用php進(jìn)行智能合約開發(fā)交互喜滨,進(jìn)行賬號(hào)創(chuàng)建、交易撤防、轉(zhuǎn)賬虽风、代幣開發(fā)以及過濾器和交易等內(nèi)容。
  • 以太坊入門教程寄月,主要介紹智能合約與dapp應(yīng)用開發(fā)辜膝,適合入門。
  • 以太坊開發(fā)進(jìn)階教程漾肮,主要是介紹使用node.js厂抖、mongodb、區(qū)塊鏈克懊、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn)忱辅,適合進(jìn)階。
  • ERC721以太坊通證實(shí)戰(zhàn)谭溉,課程以一個(gè)數(shù)字藝術(shù)品創(chuàng)作與分享DApp的實(shí)戰(zhàn)開發(fā)為主線墙懂,深入講解以太坊非同質(zhì)化通證的概念、標(biāo)準(zhǔn)與開發(fā)方案扮念。內(nèi)容包含ERC-721標(biāo)準(zhǔn)的自主實(shí)現(xiàn)损搬,講解OpenZeppelin合約代碼庫二次開發(fā),實(shí)戰(zhàn)項(xiàng)目采用Truffle,IPFS场躯,實(shí)現(xiàn)了通證以及去中心化的通證交易所谈为。
  • C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應(yīng)用踢关,包括賬戶管理伞鲫、狀態(tài)與交易、智能合約開發(fā)與交互签舞、過濾器和交易等秕脓。
  • java比特幣開發(fā)教程,本課程面向初學(xué)者儒搭,內(nèi)容即涵蓋比特幣的核心概念吠架,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制搂鲫、密鑰與腳本傍药、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能魂仍,例如創(chuàng)建地址拐辽、管理錢包、構(gòu)造裸交易等擦酌,是Java工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程俱诸。
  • php比特幣開發(fā)教程,本課程面向初學(xué)者赊舶,內(nèi)容即涵蓋比特幣的核心概念睁搭,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制笼平、密鑰與腳本园骆、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能出吹,例如創(chuàng)建地址遇伞、管理錢包、構(gòu)造裸交易等捶牢,是Php工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程鸠珠。
  • tendermint區(qū)塊鏈開發(fā)詳解,本課程適合希望使用tendermint進(jìn)行區(qū)塊鏈開發(fā)的工程師秋麸,課程內(nèi)容即包括tendermint應(yīng)用開發(fā)模型中的核心概念渐排,例如ABCI接口、默克爾樹灸蟆、多版本狀態(tài)庫等驯耻,也包括代幣發(fā)行等豐富的實(shí)操代碼,是go語言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇。

匯智網(wǎng)原創(chuàng)翻譯可缚,轉(zhuǎn)載請標(biāo)明出處霎迫。這里是原文Hyperledger Fabric如何通過虛擬機(jī)部署以太坊智能合約

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帘靡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子描姚,更是在濱河造成了極大的恐慌,老刑警劉巖轩勘,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筒扒,死亡現(xiàn)場離奇詭異绊寻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)澄步,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門观游,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驮俗,你說我怎么就攤上這事允跑。” “怎么了聋丝?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵弱睦,是天一觀的道長。 經(jīng)常有香客問我况木,道長,這世上最難降的妖魔是什么火惊? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任屹耐,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犯眠。我一直安慰自己症革,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布嗜浮。 她就那樣靜靜地躺著摩疑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雷袋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天蛋勺,我揣著相機(jī)與錄音鸠删,去河邊找鬼。 笑死刃泡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烘贴。 我是一名探鬼主播禁添,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼老翘,長吁一口氣:“原來是場噩夢啊……” “哼锻离!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纳账,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對情侶失蹤疏虫,失蹤者是張志新(化名)和其女友劉穎啤呼,沒想到半個(gè)月后呢袱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惕蹄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年治专,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泪蔫。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喘批,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出餐曹,到底是詐尸還是另有隱情敌厘,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布卿吐,位于F島的核電站锋华,受9級(jí)特大地震影響箭窜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜磺樱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一竹捉、第九天 我趴在偏房一處隱蔽的房頂上張望芜辕。 院中可真熱鬧块差,春花似錦倔丈、人聲如沸状蜗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缸血。三九已至,卻和暖如春飒炎,著一層夾襖步出監(jiān)牢的瞬間族扰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工怒竿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扩氢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓录豺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親媒抠。 傳聞我的和親對象是個(gè)殘疾皇子咏花,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容