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-samples中first-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ù)hash6d4ce63c
的get
來查詢該值腾节。
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代理
卵洗。
連接到代理
以下說明需要安裝node
和web3
。指令遵循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ī)部署以太坊智能合約