鏈碼go語言加解密 go 代碼加密

fabric-sdk-go的簡單使用

使用fabric提供的cryptogen工具生成文件模板

目前創(chuàng)新互聯(lián)公司已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務器托管、網(wǎng)站運營、企業(yè)網(wǎng)站設(shè)計、平?jīng)鼍W(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

$ cryptogen showtemplate crypto-config.yaml

進行修改,添加一個組織,一個orderer節(jié)點.

根據(jù)crypto-config.yaml文件生成證書文件:

$ cryptogen generate --config=crypto-config.yaml

查看生成的證書文件夾結(jié)構(gòu):

需要從fabric的源碼案例中拷貝configtx.yaml文件

$ cp $GOPATH/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml ./

對configtx.yaml文件進行修改.

修改之前,創(chuàng)建一個文件夾,來保存即將創(chuàng)建的創(chuàng)世區(qū)塊文件

將創(chuàng)建區(qū)塊文件和通道的命令寫到一個腳本中! generate.sh

腳本文件和配置文件的目錄結(jié)構(gòu):

執(zhí)行g(shù)enerate.sh文件生成創(chuàng)世區(qū)塊文件和通道,其實只有一個組織,也沒必要生成錨節(jié)點更新文件..

$ ./generate.sh

配置docker-compose文件:

啟動容器, 啟動后查看容器運行情況

$ docker-compose up -d

$ docker-compose ps

在這里,創(chuàng)建兩個腳本文件,用于docker容器的管理

clear_docker.sh 文件:

restart.sh 文件:

創(chuàng)建配置文件的時候,有兩個文件可以進行參考...

修改后的sdk配置文件:

創(chuàng)建出一個模型對象,給其賦值,并開始初始化sdk

使用 pkg/fabsdk/fabsdk.go中的New()方法進行實例化

創(chuàng)建請求之前,需要使用 gopackager.NewCCPackage 方法生成一個resource.CCPackage 對象,傳遞兩個參數(shù),一個是鏈碼的路徑(相對于工程的路徑), 一個是GOPATH的路徑.

安裝鏈碼,使用pkg/client/resmgmt/resmgmt.go文件中的方法

創(chuàng)建請求之前,需要生成一個*cb.SignaturePolicyEnvelope類型的對象,使用 third_party/github.com/hyperledger/fabric/common/cauthdsl/cauthdsl_builder.go 文件中的方法即可,提供了好幾個方法, 使用任意一個即可.這里使用 SignedByAnyMember 方法: 需要傳入所屬組織ID

實例化鏈碼

使用 pkg/client/channel/chclient.go 中的 Execute() 方法,來進行數(shù)據(jù)寫入的操作:

rsp, err := model.Channelclient.Execute(req)

寫入之前,要創(chuàng)建請求:

tempArgs是要傳給鏈碼的參數(shù),可以做下封裝,就不受參數(shù)個數(shù)的限制了

使用 pkg/client/channel/chclient.go 中的 Query() 方法,來進行數(shù)據(jù)查詢的操作: 查詢之前,同樣需要創(chuàng)建請求.

鏈碼在工程中的路徑應該是 工程名/chaincode文件夾

比如:

driverFabricDemo/chaincode

而不應該省略掉工程名這樣寫: chaincode

錯誤原因:cert.URIs 和 tpl.URIs 這兩個字段沒有被定義.

進入tpl對象中, /usr/local/go/src/crypto/x509/x509.go 是個結(jié)構(gòu)體,并沒有發(fā)現(xiàn) URIs 字段

對go版本進行升級,從1.9.3升級到1.11.3, 再次進入 /usr/local/go/src/crypto/x509/x509.go 文件中,查看結(jié)構(gòu)體內(nèi)容:

在執(zhí)行sdk的Excute()方法時報錯.

方法不存在,一般是由于鏈碼的Invoke方法中的方法名和Excute()方法傳入的方法名不一樣.

但是可以肯定的是,鏈碼的Invoke方法中的方法名和,項目中執(zhí)行Excute()方法時傳入的方法名是完全一樣的! 但是很奇怪了,為什么會出現(xiàn)這個錯誤呢? 使用 docker rmi 刪除掉 dev-peerx.travle.xq.com 的鏡像,再重新運行即可.

在創(chuàng)建實例化鏈碼請求的時候

總是提示

Cannot use str (type *cb.SignaturePolicyEnvelope) as type *common.SignaturePolicyEnvelope less... (?F1) Inspection info: Reports composite literals with incompatible types and values

明明是相同的類型,卻總是報錯,應該是IDE的問題.把vendor文件夾刪除后,就不會有提示了. 再使用vendor對工程進行init 和 add +external 就好了!!

出現(xiàn)這個錯誤,一般都是配置文件哪個地方寫錯了,需要細心檢查

Fabric源碼分析之Peer鏈碼安裝

environment:

fabric v1.4.2

在Fabric中交易的處理過程,客戶端將提案首先發(fā)送到背書節(jié)點,背書節(jié)點檢提案的合法性。如果合法的話,背書節(jié)點將通過交易所屬的鏈碼臨時執(zhí)行一個交易,并執(zhí)行背書節(jié)點在本地持有的狀態(tài)副本。

Chaincode應該僅僅被安裝于chaincode所有者的背書節(jié)點上,鏈碼運行在節(jié)點上的沙盒(Docker容器)中,并通過gRPC協(xié)議與相應的Peer節(jié)點進行交互,以使該chaincode邏輯對整個網(wǎng)絡(luò)的其他成員保密。

請務必在一條channel上每一個要運行你chaincode的背書節(jié)點上安裝你的chaincode

其他沒有chaincode的成員將無權(quán)成為chaincode影響下的交易的認證節(jié)點(endorser)。也就是說,他們不能執(zhí)行chaincode。不過,他們?nèi)钥梢则炞C交易并提交到賬本上。

ChainCode要在區(qū)塊鏈網(wǎng)絡(luò)中運行,需要經(jīng)過鏈碼安裝和鏈碼實例化兩個步驟。

鏈碼的安裝涉及到3個服務,分別是client,peer背書節(jié)點和LSCC容器

主要流程:

以下是在客戶端執(zhí)行 "peer chaincode install ..." 的業(yè)務流程圖:

客戶端執(zhí)行鏈碼安裝命令:

客戶端的整個流程切入點為 fabric/peer/main.go 的 main 函數(shù)

然后繼續(xù)找到 peer/chaincode/chaincode.go

繼續(xù)找到 peer/chaincode/install.go 的 installCmd 函數(shù),可以看出 chaincodeInstall 為主要的入口函數(shù)

我們進去看看 InitCmdFactory 做了什么,位置在 peer/chaincode/common.go

返回了 ChaincodeCmdFactory 的結(jié)構(gòu)體,定義為:

找到定義 genChaincodeDeploymentSpec

先看 getChaincodeSpec ,位于 peer/chaincode/common.go

封裝返回 ChaincodeSpec 結(jié)構(gòu)體

剛才生成的 ChaincodeSpec 作為 getChaincodeDeploymentSpec 函數(shù)的輸入?yún)?shù),返回 ChaincodeDeploymentSpec 結(jié)構(gòu)體

CreateInstallProposalFromCDS 位于 protos/utils/proutils.go

調(diào)用 createProposalFromCDS

從結(jié)構(gòu)體 ChaincodeInvocationSpec 可以看到用戶鏈碼安裝需要調(diào)用到系統(tǒng)鏈碼 lscc

通過 CreateProposalFromCIS=CreateChaincodeProposal=CreateChaincodeProposalWithTransient

再看 CreateChaincodeProposalWithTxIDNonceAndTransient 函數(shù)

最后返回 Proposal 結(jié)構(gòu)體,定義見 protos\peer\proposal.pb.go

到這里 install 調(diào)用的 CreateInstallProposalFromCDS 完畢,返回 Proposal 結(jié)構(gòu)體

關(guān)系有點復雜,給出一個類圖能看得清晰點

回到 install ,看 GetSignedProposal 對剛創(chuàng)建的提案結(jié)構(gòu)進行簽名

函數(shù)位于 protos/utils/txutils.go

返回 SignedProposal 結(jié)構(gòu)體,定義位于 protos/peer/proposal.pb.go

提案簽名完后 install 調(diào)用 ProcessProposal 發(fā)送提案到peer節(jié)點進行處理,參數(shù)帶了 SignedProposal 結(jié)構(gòu)體

接下來client端就等到peer的 proposalResponse

當client調(diào)用了 ProposalResponse 消息就發(fā)送到peer背書節(jié)點,也就是走peer節(jié)點背書提案流程.

要看安裝鏈碼前做了什么,直接看 peer節(jié)點背書提案流程 就好。

我們從 core/endorser/endorser.go 的 callChaincode=Execute 函數(shù)開始講

在 core/chaincode/chaincode_support.go 找到 Execute

主要看 Invoke :

根據(jù)之前的信息,我們調(diào)用的是 lscc 來安裝鏈碼,所以在peer啟動的時候已經(jīng)初始化 lscc 鏈碼容器了,所以回直接返回 handler 對象,后面的語句就不說了,在啟動鏈碼容器的章節(jié)再詳細研究。

接著我們看 execute 函數(shù),調(diào)用 createCCMessage 創(chuàng)建一個 ChaincodeMessage結(jié)構(gòu)體消息 . Execute 負責把消息發(fā)送出去

在 core/chaincode/handler.go 找到 Execute

這里關(guān)鍵是 h.serialSendAsync(msg) 語句,功能是把包裝好的信息以grpc協(xié)議發(fā)送出去,直接就等返回結(jié)果了。

至此 Execute 調(diào)用的 Invoke 就在等返回結(jié)果,結(jié)果返回就調(diào)用 processChaincodeExecutionResult 對鏈碼結(jié)果進行處理

peer發(fā)送的信息哪去了呢?

我們定位到 code/chaincode/shim/chaincode.go ,我們看到兩個入口函數(shù) Start 和 StartInProc , Start 為用戶鏈碼的入口函數(shù),而 StartInProc 是系統(tǒng)鏈碼的入口函數(shù),他們同時都調(diào)用了 chatWithPeer ,因為我們調(diào)用的是lscc,就看 StartInProc

chatWithPeer就是開啟grpc的接收模式在等到節(jié)點發(fā)來信息,接收到信息后就調(diào)用 handleMessage 處理信息。

因為我們信息類型為 ChaincodeMessage_TRANSACTION ,所以我們在 core/chaincode/shim/handler.go 順著 handleMessage=handleReady 扎到 handleTransaction

其中關(guān)鍵語句 res := handler.cc.Invoke(stub) ,這語句是調(diào)用相應鏈碼的 Invoke 函數(shù),所以我們找到 core/scc/lscc/lscc.go 下的 Invoke 函數(shù)

進去 core/scc/lscc/lscc.go 的 Invoke 函數(shù)可以看到,這里有 "INSTALL", "DEPLOY", "UPGRADE" 等操作,我們只看 INSTALL 部分。

關(guān)鍵調(diào)用函數(shù)是 executeInstall

接著看 executeInstall

HandleChaincodeInstall 為處理statedb,而 PutChaincodeToLocalStorage 是把鏈碼文件安裝到本地文件目錄

鏈碼安裝到peer的默認路徑 /var/hyperledger/production/chaincodes

到此鏈碼的安裝完畢

lscc鏈碼安裝完畢后,返回信息給peer節(jié)點,peer節(jié)點就給提案背書返回給client服務端,至此鏈碼安裝完畢。

github

參考:

5-ChainCode生命周期、分類及安裝、實例化命令解析

fabric源碼解讀【peer chaincode】:安裝鏈碼

Fabric1.4源碼解析:客戶端安裝鏈碼

java 生成的私鑰 go語言為什么不能用來解密對應Java公鑰加密過的數(shù)據(jù)?

跟語言無關(guān),跟加密算法有關(guān)。你如果調(diào)用公開的算法,用同樣的算子去加密解密,那用哪種需要都一樣,關(guān)鍵就是很多算法都有你不了解的細節(jié),有些算子是編程語言自己用了默認值,而他們彼此不同

網(wǎng)站題目:鏈碼go語言加解密 go 代碼加密
文章網(wǎng)址:http://www.muchs.cn/article40/hggceo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、品牌網(wǎng)站建設(shè)全網(wǎng)營銷推廣、Google、網(wǎng)站導航、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)