真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

鏈碼go語(yǔ)言加解密 go 代碼加密

fabric-sdk-go的簡(jiǎn)單使用

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

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

$ cryptogen showtemplate crypto-config.yaml

進(jìn)行修改,添加一個(gè)組織,一個(gè)orderer節(jié)點(diǎn).

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

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

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

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

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

對(duì)configtx.yaml文件進(jìn)行修改.

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

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

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

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

$ ./generate.sh

配置docker-compose文件:

啟動(dòng)容器, 啟動(dòng)后查看容器運(yùn)行情況

$ docker-compose up -d

$ docker-compose ps

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

clear_docker.sh 文件:

restart.sh 文件:

創(chuàng)建配置文件的時(shí)候,有兩個(gè)文件可以進(jìn)行參考...

修改后的sdk配置文件:

創(chuàng)建出一個(gè)模型對(duì)象,給其賦值,并開(kāi)始初始化sdk

使用 pkg/fabsdk/fabsdk.go中的New()方法進(jìn)行實(shí)例化

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

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

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

實(shí)例化鏈碼

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

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

寫(xiě)入之前,要?jiǎng)?chuàng)建請(qǐng)求:

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

使用 pkg/client/channel/chclient.go 中的 Query() 方法,來(lái)進(jìn)行數(shù)據(jù)查詢的操作: 查詢之前,同樣需要?jiǎng)?chuàng)建請(qǐng)求.

鏈碼在工程中的路徑應(yīng)該是 工程名/chaincode文件夾

比如:

driverFabricDemo/chaincode

而不應(yīng)該省略掉工程名這樣寫(xiě): chaincode

錯(cuò)誤原因:cert.URIs 和 tpl.URIs 這兩個(gè)字段沒(méi)有被定義.

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

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

在執(zhí)行sdk的Excute()方法時(shí)報(bào)錯(cuò).

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

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

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

總是提示

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

明明是相同的類型,卻總是報(bào)錯(cuò),應(yīng)該是IDE的問(wèn)題.把vendor文件夾刪除后,就不會(huì)有提示了. 再使用vendor對(duì)工程進(jìn)行init 和 add +external 就好了!!

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

Fabric源碼分析之Peer鏈碼安裝

environment:

fabric v1.4.2

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

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

請(qǐng)務(wù)必在一條channel上每一個(gè)要運(yùn)行你chaincode的背書(shū)節(jié)點(diǎn)上安裝你的chaincode

其他沒(méi)有chaincode的成員將無(wú)權(quán)成為chaincode影響下的交易的認(rèn)證節(jié)點(diǎn)(endorser)。也就是說(shuō),他們不能執(zhí)行chaincode。不過(guò),他們?nèi)钥梢则?yàn)證交易并提交到賬本上。

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

鏈碼的安裝涉及到3個(gè)服務(wù),分別是client,peer背書(shū)節(jié)點(diǎn)和LSCC容器

主要流程:

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

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

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

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

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

我們進(jìn)去看看 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

通過(guò) CreateProposalFromCIS=CreateChaincodeProposal=CreateChaincodeProposalWithTransient

再看 CreateChaincodeProposalWithTxIDNonceAndTransient 函數(shù)

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

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

關(guān)系有點(diǎn)復(fù)雜,給出一個(gè)類圖能看得清晰點(diǎn)

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

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

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

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

接下來(lái)client端就等到peer的 proposalResponse

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

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

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

在 core/chaincode/chaincode_support.go 找到 Execute

主要看 Invoke :

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

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

在 core/chaincode/handler.go 找到 Execute

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

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

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

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

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

因?yàn)槲覀冃畔㈩愋蜑?ChaincodeMessage_TRANSACTION ,所以我們?cè)?core/chaincode/shim/handler.go 順著 handleMessage=handleReady 扎到 handleTransaction

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

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

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

接著看 executeInstall

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

鏈碼安裝到peer的默認(rèn)路徑 /var/hyperledger/production/chaincodes

到此鏈碼的安裝完畢

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

github

參考:

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

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

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

java 生成的私鑰 go語(yǔ)言為什么不能用來(lái)解密對(duì)應(yīng)Java公鑰加密過(guò)的數(shù)據(jù)?

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


分享標(biāo)題:鏈碼go語(yǔ)言加解密 go 代碼加密
URL網(wǎng)址:http://weahome.cn/article/hggceo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部