私有區塊鏈Hyperledger Fabric和公共區塊鏈ARK.io如何通過solidity智慧合約結合
我想展示如何將公共區塊鏈(如ARK.io)的功能與私有區塊鏈(如Hyperledger)結合起來。特別是,我們將看到ARK.io上的交易如何觸發在Hyperledger Fabric + Burrow中部署的Solidity Smart Contract的執行。
安裝Hyperledger Fabric
刪除以前的Hyperledger Docker映象(如果有):
docker kill $(docker ps -q) docker rm $(docker ps -aq) docker rmi $(docker images dev-* -q)
安裝先決條件:
https://hyperledger-fabric.readthedocs.io/en/latest/prereqs.html
安裝依賴項:
https://hyperledger-fabric.readthedocs.io/en/latest/install.html cd ~ curl -sSL http://bit.ly/2ysbOFE | bash -s 1.3.0
設定環境變數:
vi ~/.profile PATH="$HOME/bin:$HOME/.local/bin:$PATH" GOPATH="$HOME/go" FABRIC_CFG_PATH="$GOPATH/src/github.com/hyperledger/fabric-samples/config" PATH="$GOPATH/bin:/usr/lib/go-1.10/bin:$GOPATH/src/github.com/hyperledger/fabric-samples/bin:$PATH" export FABPROXY_CONFIG=$GOPATH/src/github.com/hyperledger/fabric-chaincode-evm/examples/first-network-sdk-config.yaml FABPROXY_USER=User1 FABPROXY_ORG=Org1 FABPROXY_CHANNEL=mychannel FABPROXY_CCID=evmcc PORT=5000 source ~/.profile
生成網路架構:
https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html git clone https://github.com/hyperledger/fabric-samples.git cd $GOPATH/src/github.com/hyperledger/fabric-samples/first-network ./byfn.sh generate
安裝go語言
sudo apt-get remove golang-go sudo apt-get remove --auto-remove golang-go sudo add-apt-repository ppa:gophers/archive sudo apt-get update sudo apt-get install golang-1.10-go
安裝Hyperledger go SDK:
go get -u github.com/hyperledger/fabric-sdk-go go get -u github.com/cloudflare/cfssl/cmd/cfssl go get -u github.com/golang/mock/gomock go get -u github.com/golang/protobuf/proto go get -u github.com/golang/protobuf/ptypes go get -u github.com/golang/protobuf/ptypes/timestamp
安裝EVM Chaincode
cd ~ git clone https://github.com/hyperledger/fabric-chaincode-evm.git $GOPATH/src/github.com/hyperledger cd fabric-samples/first-network/ vi docker-compose-cli.yaml
新增:
cli: volumes: - ./../../fabric-chaincode-evm:/opt/gopath/src/github.com/hyperledger/fabric-chaincode-evm
關閉網路(如果它已啟動):
./byfn.sh -m down
重新建立網路:
./byfn.sh -m up
構建並啟動EVM
docker exec -it cli bash
為PEER0設定環境變數:
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
接下來在所有對等端上安裝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 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
部署智慧合約
我們將使用一個簡單儲存合約: https://solidity.readthedocs.io/en/v0.4.24/introduction-to-smart-contracts.html
peer chaincode invoke -n evmcc -C mychannel-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
請注意包含合約地址的輸出:
2018-11-10 00:15:28.257 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"7ec1f20fced5ed8d47f94cdab140644a28a85441"
要驗證你的合約是否已成功部署,你可以在evmcc中查詢合約的執行時位元組碼:
root@3e4b9a88b2b6:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -n evmcc -C mychannel -c '{"Args":["getCode","7ec1f20fced5ed8d47f94cdab140644a28a85441"]}' 6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b348015605957600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b348015608357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058203dbaed52da8059a841ed6d7b484bf6fa6f61a7e975a803fdedf076a121a8c4010029
與已部署的合約互動
peer chaincode invoke -n evmcc -C mychannel -c '{"Args":["7ec1f20fced5ed8d47f94cdab140644a28a85441","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 2018-11-10 00:25:31.005 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 peer chaincode query -n evmcc -C mychannel -c '{"Args":["7ec1f20fced5ed8d47f94cdab140644a28a85441","6d4ce63c"]}' --hex
獲取使用者帳戶地址
root@3e4b9a88b2b6:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -n evmcc -C mychannel -c '{"Args":["account"]}'
結果 03F3C6F335B678F65B41820D97F01BA1151CDF62
使用Web3
設定Fab代理
我們已經在我們的.profile中定義了這些:
export FABPROXY_CONFIG=$GOPATH/src/github.com/hyperledger/fabric-chaincode-evm/examples/first-network-sdk-config.yaml export FABPROXY_USER=User1 export FABPROXY_ORG=Org1 export FABPROXY_CHANNEL=mychannel export FABPROXY_CCID=evmcc export PORT=5000
開啟埠:
sudo ufw allow 5000
構建代理:
cd $GOPATH/src/github.com/hyperledger/fabric-chaincode-evm go build -o fab3 ./fabproxy/cmd
啟動代理:
cd ~/go/src/github.com/hyperledger/fabric-chaincode-evm ./fab3
應該看到:
Starting Fab Proxy on port 5000
與先前部署的合約互動
在不同的終端視窗中:
安裝web3:
npm install [email protected]
啟動node會話:
node Web3 = require('web3') web3 = new Web3(new Web3.providers.HttpProvider('http://159.89.146.143:5000')) web3.eth.defaultAccount = web3.eth.accounts[0] 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" } ] SimpleStorage = web3.eth.contract(simpleStorageABI) myContract = SimpleStorage.at('7ec1f20fced5ed8d47f94cdab140644a28a85441') myContract.set(10) myContract.get().toNumber()
ARK.io外掛觸發智慧合約
如果你還沒有這樣做,請按照 這篇文章 安裝Ark Relay和Hyperledger外掛:
最新的外掛程式碼可在以下位置找到: https://github.com/Ark-Labs/ark-hyperledger-plugin
請注意,與web3整合相關的部分。首先,我們檢查一下,如果“schema”==“web3”,那麼我們將執行委託給 simpleStorage
:
我們通過web3和fab代理呼叫我們的智慧合約:
通過ARK.io桌面錢包觸發智慧合約
確保安裝了 ark-hyperledger-plugin
並且 relay
正在執行。啟動後,你應該在中繼日誌中看到最後一個條目:
確保fab代理正在Hyperledger例項上執行,它正在偵聽埠5000:
通過桌面錢包提交Ark交易:
觀察Ark replay日誌中的輸出以及新應用的交易的詳細資訊:
開啟節點控制檯並檢查Smart Contract是否選擇了新值:
======================================================================
分享一些Fabric、以太坊、比特幣、EOS等區塊鏈相關的互動式線上程式設計實戰教程:
- Hyperledger Fabric 區塊鏈開發詳解 ,本課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、許可權策略、通道配置與啟動、鏈碼通訊介面等核心概念,也包含Fabric網路設計、nodejs鏈碼與應用開發的操作實踐,是Nodejs工程師學習Fabric區塊鏈開發的最佳選擇。
- Hyperledger Fabric java 區塊鏈開發詳解 ,課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、許可權策略、通道配置與啟動、鏈碼通訊介面等核心概念,也包含Fabric網路設計、java鏈碼與應用開發的操作實踐,是java工程師學習Fabric區塊鏈開發的最佳選擇。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- c#比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在C#程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是C#工程師不可多得的比特幣開發學習課程。
- java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- ERC721以太坊通證實戰,課程以一個數字藝術品創作與分享DApp的實戰開發為主線,深入講解以太坊非同質化通證的概念、標準與開發方案。內容包含ERC-721標準的自主實現,講解OpenZeppelin合約程式碼庫二次開發,實戰專案採用Truffle,IPFS,實現了通證以及去中心化的通證交易所。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
- EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- 深入淺出玩轉EOS錢包開發 ,本課程以手機EOS錢包的完整開發過程為主線,深入學習EOS區塊鏈應用開發,課程內容即涵蓋賬戶、計算資源、智慧合約、動作與交易等EOS區塊鏈的核心概念,同時也講解如何使用eosjs和eosjs-ecc開發包訪問EOS區塊鏈,以及如何在React前端應用中整合對EOS區塊鏈的支援。課程內容深入淺出,非常適合前端工程師深入學習EOS區塊鏈應用開發。
- tendermint區塊鏈開發詳解 ,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裡是 私有區塊鏈Hyperledger Fabric和公共區塊鏈ARK.io如何通過solidity智慧合約結合