如何制作一個(gè)優(yōu)秀網(wǎng)站建設(shè)如何進(jìn)行網(wǎng)絡(luò)推廣和宣傳
解決了官方示例指令需要科學(xué)上網(wǎng)才能運(yùn)行的問(wèn)題(通過(guò)手動(dòng)下載二進(jìn)制文件和拉取官方fabric-samples)。具體的將bootstrap.sh腳本解讀了一遍 具體可以參照我的博客 fabric中bootstrap.sh到底幫助我們干了什么?(curl -sSL https://bit.ly/2ysbOFE | bash -s執(zhí)行不成功,如何手動(dòng)執(zhí)行相相關(guān)操作?)_sh bootstrap.sh_小小小小關(guān)同學(xué)的博客-CSDN博客
前期的準(zhǔn)備工作不再記錄 也就是安裝go docker docker-compose等操作
鏈碼部署與調(diào)用等操作基于完成克隆fabric-samples倉(cāng)庫(kù)、拉取二進(jìn)制文件、下載需要的鏡像這些操作之后
這個(gè)腳本可以快速幫助我們搭建起自己的fabric網(wǎng)絡(luò) 是一個(gè)單機(jī)多節(jié)點(diǎn)的示例。對(duì)于腳本的具體實(shí)現(xiàn)在搭建完多級(jí)部署后再看會(huì)有不一樣的體會(huì),將一些指令通過(guò)腳本的方式封裝執(zhí)行節(jié)省了使用者的操作,類似于一個(gè)fabric嘗鮮。筆記中還有對(duì)basic鏈碼的標(biāo)注,看懂鏈碼學(xué)會(huì)調(diào)用!
1.查看test-network腳本的使用說(shuō)明
./network.sh -h
可以看出我們可以通過(guò)他給出的這些指令來(lái)完成對(duì)應(yīng)的功能,也可以用過(guò)一些參數(shù)也自定義通道名稱。
2.啟動(dòng)測(cè)試網(wǎng)絡(luò)
./network.sh up
啟動(dòng)后創(chuàng)建了四個(gè)結(jié)點(diǎn): cli ;兩個(gè)peer結(jié)點(diǎn) 一個(gè)排序結(jié)點(diǎn)。
3.創(chuàng)建通道
?
./network.sh createChannel (可以帶上 -c 通道名稱 來(lái)指定)我使用的是默認(rèn)名稱mychannel
?執(zhí)行成功后
4.在通道上安裝一個(gè)鏈碼
?在我們安裝鏈碼之前最好去鏈碼所在的目錄去查看一下鏈碼所需要的依賴包是否成功導(dǎo)入:
可以先進(jìn)入到鏈碼所在的目錄看一看:../asset-transfer-basic/chaincode-go 就是這個(gè)目錄下。
?cd ../asset-transfer-basic/chaincode-go
這里已經(jīng)有了vendor 之前遇見(jiàn)過(guò)沒(méi)有的情況 也就是要自己手動(dòng)拉取一下(go mod vendor)
然后回到test-network執(zhí)行部署鏈碼命令
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
成功后:
?注意:
如果沒(méi)有vendor的話可與參考下面的方法,有的話直接跳過(guò)就可以(有的時(shí)候沒(méi)有的話也先執(zhí)行一些啟動(dòng)連鏈碼的那條指令 可能會(huì)幫助拉取vendor)
執(zhí)行前注意使用 go env 查看go環(huán)境 確認(rèn)配置好了gomoudle ,然后在chaincode-go目錄下輸入
go mod vendor 即可 然后再次查看就能看到vendor
回到測(cè)試網(wǎng)絡(luò).sh文件所在的目錄下 重新啟動(dòng)鏈碼即可
?
5 與網(wǎng)絡(luò)交互
到現(xiàn)在我們的basic鏈碼已經(jīng)成功安裝了,現(xiàn)在我們可以對(duì)basic鏈碼的功能來(lái)一個(gè)測(cè)試了:
- 使用以下命令將這些二進(jìn)制文件添加到您的CLI路徑:
export PATH=${PWD}/../bin:$PATH
- 您還需要將fabric-samples代碼庫(kù)中的FABRIC_CFG_PATH設(shè)置為指向其中的core.yaml文件:
export FABRIC_CFG_PATH=$PWD/../config/
- 現(xiàn)在,您可以設(shè)置環(huán)境變量,以允許您作為Org1操作peer CLI:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=localhost:7051
- 運(yùn)行以下命令用一些資產(chǎn)來(lái)初始化賬本:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'
這是初始化賬本的源碼實(shí)現(xiàn),就是講結(jié)構(gòu)變量通過(guò)json.Marshal轉(zhuǎn)換成json 再通過(guò)PutState講資產(chǎn)存入世界狀態(tài)。
- 現(xiàn)在你可以用你的 CLI 工具來(lái)查詢賬本。運(yùn)行以下指令來(lái)獲取添加到通道賬本的資產(chǎn)列表(在運(yùn)行指令之前可以先看看鏈碼中對(duì)于這個(gè)函數(shù)的實(shí)現(xiàn)到底是怎樣的):
可以看到這個(gè)想要調(diào)用這這個(gè)函數(shù) 只需要一個(gè)傳入一個(gè)交易上下文接口就可以了,但是在使用中這個(gè)應(yīng)該是fabric內(nèi)部自己傳入的并不需要我們來(lái)傳入,所以對(duì)于這個(gè)函數(shù)我們并不需要傳入任何參數(shù),直接給出函數(shù)名即可。
peer chaincode query -C gdwchannel -n basic -c '{"Args":["GetAllAssets"]}'
- basic中還給出了一些其他函數(shù),我們可以看看具體怎么實(shí)現(xiàn)的 然后來(lái)調(diào)用它
- 添加資產(chǎn)
命令:(下面命令一次性輸入)
peer chaincode invoke -o localhost:7050 \--ordererTLSHostnameOverride orderer.example.com \--tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \-C mychannel \-n basic \--peerAddresses localhost:7051 \--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \--peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \-c '{"function":"CreateAsset","Args":["asset7","pink","20","HEUN","888"]}'
- 刪除資產(chǎn)
peer chaincode invoke -o localhost:7050 \--ordererTLSHostnameOverride orderer.example.com \--tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \-C mychannel \-n basic \--peerAddresses localhost:7051 \--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \--peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \-c '{"function":"DeleteAsset","Args":["asset1"]}'
- 更新資產(chǎn)(修改資產(chǎn))
peer chaincode invoke -o localhost:7050 \--ordererTLSHostnameOverride orderer.example.com \--tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \-C mychannel \-n basic \--peerAddresses localhost:7051 \--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \--peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \-c '{"function":"UpdateAsset","Args":["asset7","RED","20","gdw","888"]}'
- 轉(zhuǎn)移資產(chǎn)
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
- 切換身份
之前都是使用組織1來(lái)驗(yàn)證代碼的增刪改查操作,現(xiàn)在我們可以再開一個(gè)終端,用組織2來(lái)驗(yàn)證功能,只需要變更環(huán)境變量即可!
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=localhost:9051
然后就可以在 peer0.org2.example.com上來(lái)調(diào)用一些智能合約,比如來(lái)查詢我們自定義的資產(chǎn)7看看是否能在組織二上查詢到
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset7"]}'
完成后想要關(guān)閉測(cè)試網(wǎng)絡(luò)的話可以執(zhí)行:
./network.sh down