摘要:一個(gè)更新提案,認(rèn)可,然后返回到應(yīng)用程序,然后將其發(fā)送給每個(gè)對(duì)等點(diǎn)的分類(lèi)帳我們對(duì)分類(lèi)賬的第一次更新將是創(chuàng)建一輛新車(chē),我們有一個(gè)多帶帶的程序我們將用它來(lái)進(jìn)行更新。
編寫(xiě)第一個(gè)應(yīng)用程序
如果你還不熟悉Fabric網(wǎng)絡(luò)的基本架構(gòu),則可能需要在繼續(xù)之前訪問(wèn)“介紹”和“構(gòu)建你的第一個(gè)網(wǎng)絡(luò)”文檔。
在本節(jié)中,我們將介紹一些示例程序,以了解Fabric應(yīng)用程序的工作原理,這些應(yīng)用程序(以及他們使用的智能合約) - 統(tǒng)稱(chēng)為fabcar - 提供了Fabric功能的廣泛演示。值得注意的是,我們將展示與證書(shū)頒發(fā)機(jī)構(gòu)進(jìn)行交互并生成注冊(cè)證書(shū)的過(guò)程,之后我們將利用這些身份來(lái)查詢和更新分類(lèi)帳。
我們將經(jīng)歷三個(gè)主要步驟:
1.設(shè)置開(kāi)發(fā)環(huán)境。我們的應(yīng)用程序需要一個(gè)網(wǎng)絡(luò)進(jìn)行交互,因此我們將下載一個(gè)僅限于我們所需的注冊(cè)/登記,查詢和更新的組件:
2.學(xué)習(xí)我們的應(yīng)用程序?qū)⑹褂玫氖纠悄芎霞s的參數(shù)。我們的智能合約包含各種功能,使我們能夠以不同的方式與分類(lèi)帳進(jìn)行交互,我們將進(jìn)入并檢查該智能合約,以了解我們的應(yīng)用程序?qū)⑹褂玫墓δ堋?/p>
3.開(kāi)發(fā)應(yīng)用程序以便能夠在分類(lèi)帳上查詢和更新資產(chǎn)。我們將進(jìn)入應(yīng)用程序代碼本身(我們的應(yīng)用程序已用Javascript編寫(xiě))并手動(dòng)操作變量以運(yùn)行不同類(lèi)型的查詢和更新。
完成本教程后,你應(yīng)該基本了解應(yīng)用程序如何與智能合約一起編程,以與Fabric網(wǎng)絡(luò)上的分類(lèi)帳(即對(duì)等方)進(jìn)行交互。
設(shè)置開(kāi)發(fā)環(huán)境如果你已經(jīng)完成了構(gòu)建你的第一個(gè)網(wǎng)絡(luò),你應(yīng)該已經(jīng)設(shè)置了你的開(kāi)發(fā)環(huán)境,并且已經(jīng)下載了fabric-samples以及隨附的工件。要運(yùn)行本教程,你現(xiàn)在需要做的就是拆除現(xiàn)有的任何網(wǎng)絡(luò),你可以通過(guò)發(fā)出以下命令來(lái)執(zhí)行此操作:
./byfn.sh down
如果你沒(méi)有開(kāi)發(fā)環(huán)境以及網(wǎng)絡(luò)和應(yīng)用程序的附帶工件,訪問(wèn)“前提條件”頁(yè)面,確保你的計(jì)算機(jī)上已安裝必要的依賴(lài)項(xiàng)。
接下來(lái),如果你還沒(méi)有這樣做的話,訪問(wèn)”安裝示例、二進(jìn)制文件和Docker鏡像“頁(yè)面并按照提供的說(shuō)明進(jìn)行操作。克隆fabric-samples存儲(chǔ)庫(kù)后返回本教程,并下載最新的穩(wěn)定Fabric鏡像和可用實(shí)用程序。
此時(shí)所有的都應(yīng)該已安裝,導(dǎo)航到fabric-samples存儲(chǔ)庫(kù)中的fabcar子目錄,并查看內(nèi)部的內(nèi)容:
cd fabric-samples/fabcar && ls
你應(yīng)該看到以下內(nèi)容:
enrollAdmin.js invoke.js package.json query.js registerUser.js startFabric.sh
在開(kāi)始之前,我們還需要做一些家務(wù),運(yùn)行以下命令以終止任何陳舊或活動(dòng)容器:
docker rm -f $(docker ps -aq)
清除所有緩存的網(wǎng)絡(luò):
# Press "y" when prompted by the command docker network prune
最后,如果你已經(jīng)完成本教程,你還需要?jiǎng)h除fabcar智能合約的基礎(chǔ)鏈碼鏡像,如果你是第一次瀏覽此內(nèi)容的用戶,那么你的系統(tǒng)上將不會(huì)顯示此鏈碼鏡像:
docker rmi dev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba安裝客戶端并啟動(dòng)網(wǎng)絡(luò)
以下說(shuō)明要求你位于fabric-samples repo的本地克隆中的fabcar子目錄中,在本教程的其余部分中,保留在此子目錄的根目錄下。
運(yùn)行以下命令以安裝應(yīng)用程序的Fabric依賴(lài)項(xiàng),我們關(guān)注fabric-ca-client,它允許我們的應(yīng)用程序與CA服務(wù)器通信并檢索身份資料,還有fabric-client,它允許我們加載身份資料并與對(duì)等點(diǎn)和排序服務(wù)交流。
npm install
使用startFabric.sh shell腳本啟動(dòng)網(wǎng)絡(luò),此命令將啟動(dòng)我們的各種Fabric實(shí)體,并為Golang編寫(xiě)的鏈碼啟動(dòng)智能合約容器:
./startFabric.sh
你還可以選擇針對(duì)Node.js中編寫(xiě)的鏈碼運(yùn)行本教程,如果你想追求這條路線,請(qǐng)發(fā)出以下命令:
./startFabric.sh node
請(qǐng)注意,Node.js鏈碼場(chǎng)景大約需要90秒才能完成;也許更長(zhǎng)。腳本沒(méi)有掛起,而是增加的時(shí)間是在構(gòu)建鏈碼鏡像時(shí)安裝fabric-shim的結(jié)果。
好了,現(xiàn)在你有一個(gè)示例網(wǎng)絡(luò)和一些代碼,讓我們來(lái)看看不同的部分如何組合在一起。
應(yīng)用程序如何與網(wǎng)絡(luò)交互要更深入地了解我們fabcar網(wǎng)絡(luò)中的組件(以及它們?nèi)绾尾渴穑┮约皯?yīng)用程序如何在更精細(xì)的級(jí)別上與這些組件進(jìn)行交互,請(qǐng)參閱了解Fabcar網(wǎng)絡(luò)。
開(kāi)發(fā)人員更有興趣了解應(yīng)用程序的作用 - 以及查看代碼本身以查看應(yīng)用程序的構(gòu)建方式 - 應(yīng)該繼續(xù)下去,目前,最重要的是要知道應(yīng)用程序使用軟件開(kāi)發(fā)工具包(SDK)來(lái)訪問(wèn)允許查詢和更新分類(lèi)帳的API。
登記管理員用戶以下兩節(jié)涉及與證書(shū)頒發(fā)機(jī)構(gòu)的通信,你可能會(huì)發(fā)現(xiàn)當(dāng)運(yùn)行即將到來(lái)的程序時(shí)流式傳輸CA日志很有用。
要流式傳輸CA日志,請(qǐng)拆分終端或打開(kāi)新shell并發(fā)出以下命令:
docker logs -f ca.example.com
現(xiàn)在回到帶著fabcar內(nèi)容的終端……
當(dāng)我們啟動(dòng)我們的網(wǎng)絡(luò),管理員用戶 - admin - 已在我們的證書(shū)頒發(fā)機(jī)構(gòu)注冊(cè),現(xiàn)在我們需要向CA服務(wù)器發(fā)送登記調(diào)用,并為該用戶檢索登記證書(shū)(eCert)。我們不會(huì)在這里深入研究登記詳情,但只需說(shuō)SDK和擴(kuò)展我們的應(yīng)用程序需要此證書(shū)才能為管理員形成用戶對(duì)象,然后我們將使用此管理員對(duì)象隨后注冊(cè)并登記新用戶,發(fā)送管理員登記調(diào)用到CA服務(wù)器:
node enrollAdmin.js
該程序?qū)⒄{(diào)用證書(shū)簽名請(qǐng)求(CSR)并最終將eCert和密鑰材料輸出到新創(chuàng)建的文件夾 - hfc-key-store - 該項(xiàng)目的根目錄下,當(dāng)我們的應(yīng)用需要為各種用戶創(chuàng)建或加載身份對(duì)象時(shí)會(huì)查看此位置。
注冊(cè)并登記user1使用我們新生成的管理員eCert,我們現(xiàn)在將再次與CA服務(wù)器通信以注冊(cè)和登記新用戶。此用戶 - user1 - 將是我們?cè)诓樵兒透路诸?lèi)帳時(shí)使用的身份。這里需要注意的是,管理員身份是為我們的新用戶發(fā)出注冊(cè)和登記調(diào)用(即該用戶扮演注冊(cè)員的角色),發(fā)送為user1注冊(cè)并登記的調(diào)用:
node registerUser.js
與管理員登記類(lèi)似,該程序調(diào)用CSR并將密鑰和eCert輸出到hfc-key-store子目錄中,所以現(xiàn)在我們有兩個(gè)獨(dú)立用戶的身份資料 - admin和user1,是時(shí)候與分類(lèi)賬互動(dòng)了......
查詢分類(lèi)帳查詢是你從分類(lèi)帳中讀取數(shù)據(jù)的方式,該數(shù)據(jù)存儲(chǔ)為一系列鍵值對(duì),并且你可以查詢單個(gè)鍵,多個(gè)鍵的值,或者 - 如果分類(lèi)帳是以JSON等豐富的數(shù)據(jù)存儲(chǔ)格式編寫(xiě)的 - 對(duì)其執(zhí)行復(fù)雜搜索(例如,查找包含特定關(guān)鍵字的所有資產(chǎn))。
這是查詢?nèi)绾喂ぷ鞯谋硎荆?/p>
首先,讓我們運(yùn)行query.js程序,返回分類(lèi)帳中所有汽車(chē)的清單,我們將使用我們的第二個(gè)身份 - user1 - 作為此應(yīng)用程序的簽名實(shí)體,我們程序中的以下行將user1指定為簽名者:
fabric_client.getUserContext("user1", true);
回想一下,user1登記資料已經(jīng)放入我們的hfc-key-store子目錄中,所以我們只需要告訴我們的應(yīng)用程序獲取該身份,隨著用戶對(duì)象的定義,我們現(xiàn)在可以從分類(lèi)賬中繼續(xù)讀取。一個(gè)查詢所有汽車(chē)的功能,queryAllCars,已預(yù)先加載到應(yīng)用程序中,因此我們可以簡(jiǎn)單地按原樣運(yùn)行程序:
node query.js
它應(yīng)該返回這樣的東西:
Successfully loaded user1 from persistence Query has completed, checking results Response is [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}}, {"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}}, {"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}}, {"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}}, {"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}}, {"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}}, {"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}}, {"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}}, {"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}}, {"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]
這些是10輛車(chē),Adriana擁有的黑色特斯拉Model S,Brad擁有的紅色福特Mustang,Pari擁有的紫羅蘭菲亞特Punto,等等。分類(lèi)帳是基于鍵值的,在我們的實(shí)現(xiàn)中,鍵是CAR0到CAR9,這將在一瞬間變得特別重要。
讓我們仔細(xì)看看這個(gè)程序,使用編輯器(例如atom或visual studio)并打開(kāi)query.js。
應(yīng)用程序的初始部分定義了某些變量,例如通道名稱(chēng),證書(shū)存儲(chǔ)位置和網(wǎng)絡(luò)端點(diǎn),在我們的示例應(yīng)用中,這些變量已被植入,但在真正的應(yīng)用程序中,這些變量必須由app dev指定。
var channel = fabric_client.newChannel("mychannel"); var peer = fabric_client.newPeer("grpc://localhost:7051"); channel.addPeer(peer); var member_user = null; var store_path = path.join(__dirname, "hfc-key-store"); console.log("Store path:"+store_path); var tx_id = null;
這是我們構(gòu)造查詢的塊:
// queryCar chaincode function - requires 1 argument, ex: args: ["CAR4"], // queryAllCars chaincode function - requires no arguments , ex: args: [""], const request = { //targets : --- letting this default to the peers assigned to the channel chaincodeId: "fabcar", fcn: "queryAllCars", args: [""] };
當(dāng)應(yīng)用程序運(yùn)行時(shí),它調(diào)用了對(duì)等點(diǎn)的fabcar鏈碼,在其中運(yùn)行queryAllCars函數(shù),并且沒(méi)有傳遞任何參數(shù)。
要了解我們智能合約中的可用功能,導(dǎo)航到fabric-samples根目錄下的chaincode/fabcar/go子目錄,并在編輯器中打開(kāi)fabcar.go。
這些相同的功能在fabcar鏈碼的Node.js版本中定義。
你將看到我們可以調(diào)用以下函數(shù):initLedger,queryCar,queryAllCars,createCar和changeCarOwner。
讓我們仔細(xì)看看queryAllCars函數(shù),看看它如何與分類(lèi)帳交互。
func (s *SmartContract) queryAllCars(APIstub shim.ChaincodeStubInterface) sc.Response { startKey := "CAR0" endKey := "CAR999" resultsIterator, err := APIstub.GetStateByRange(startKey, endKey)
這定義了queryAllCars的范圍,CAR0和CAR999之間的每輛車(chē) - 總共1,000輛車(chē),假設(shè)每個(gè)鍵都已正確標(biāo)記 - 將由查詢返回。
下面是一個(gè)應(yīng)用程序如何在鏈碼中調(diào)用不同函數(shù)的表示,每個(gè)函數(shù)都必須在鏈碼shim接口中針對(duì)可用的API進(jìn)行編碼,這反過(guò)來(lái)又允許智能合約容器與對(duì)等點(diǎn)分類(lèi)帳正確連接。
我們可以看到我們的queryAllCars函數(shù),以及一個(gè)名為createCar的函數(shù),它將允許我們更新分類(lèi)帳并最終在一瞬間將新區(qū)塊附加到鏈中。
但首先,返回query.js程序并編輯構(gòu)造函數(shù)請(qǐng)求以查詢CAR4,我們通過(guò)將query.js中的函數(shù)從queryAllCars更改為queryCar并將CAR4作為特定鍵傳遞來(lái)完成此操作。
query.js程序現(xiàn)在看起來(lái)應(yīng)該是這樣的:
const request = { //targets : --- letting this default to the peers assigned to the channel chaincodeId: "fabcar", fcn: "queryCar", args: ["CAR4"] };
保存程序并導(dǎo)航回fabcar目錄,現(xiàn)在再次運(yùn)行程序:
node query.js
你應(yīng)該看到以下內(nèi)容:
{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}
如果你回過(guò)頭來(lái)看看我們之前查詢過(guò)每輛車(chē)的結(jié)果,你可以看到CAR4是Adriana的黑色特斯拉型號(hào)S,這是在這里返回的結(jié)果。
使用queryCar函數(shù),我們可以查詢?nèi)魏捂I(例如CAR0)并獲取與該車(chē)相對(duì)應(yīng)的任何品牌,型號(hào),顏色和所有者。
很好,此時(shí)你應(yīng)該熟悉智能合約中的基本查詢功能以及查詢程序中的少數(shù)參數(shù),是時(shí)候更新分類(lèi)帳.....
更新分類(lèi)帳現(xiàn)在我們已經(jīng)完成了一些分類(lèi)帳查詢并添加了一些代碼,我們準(zhǔn)備更新分類(lèi)帳,我們可以做很多潛在的更新,但讓我們從創(chuàng)建汽車(chē)開(kāi)始吧。
下面我們可以看到這個(gè)過(guò)程如何運(yùn)作。一個(gè)更新提案,認(rèn)可,然后返回到應(yīng)用程序,然后將其發(fā)送給每個(gè)對(duì)等點(diǎn)的分類(lèi)帳:
我們對(duì)分類(lèi)賬的第一次更新將是創(chuàng)建一輛新車(chē),我們有一個(gè)多帶帶的Javascript程序 - invoke.js - 我們將用它來(lái)進(jìn)行更新。就像查詢一樣,使用編輯器打開(kāi)程序并導(dǎo)航到我們構(gòu)造調(diào)用的代碼塊:
// createCar chaincode function - requires 5 args, ex: args: ["CAR12", "Honda", "Accord", "Black", "Tom"], // changeCarOwner chaincode function - requires 2 args , ex: args: ["CAR10", "Barry"], // must send the proposal to endorsing peers var request = { //targets: let default to the peer assigned to the client chaincodeId: "fabcar", fcn: "", args: [""], chainId: "mychannel", txId: tx_id };
你將看到我們可以調(diào)用兩個(gè)函數(shù)之一 - createCar或changeCarOwner,首先,讓我們創(chuàng)建一個(gè)紅色雪佛蘭Volt并將其交給名為Nick的所有者,我們的分類(lèi)帳上有CAR9,所以我們?cè)谶@里使用CAR10作為識(shí)別鍵,編輯此代碼塊如下所示:
var request = { //targets: let default to the peer assigned to the client chaincodeId: "fabcar", fcn: "createCar", args: ["CAR10", "Chevy", "Volt", "Red", "Nick"], chainId: "mychannel", txId: tx_id };
保存并運(yùn)行程序:
node invoke.js
終端中會(huì)有一些關(guān)于ProposalResponse和promises的輸出,但是,我們所關(guān)注的是這條消息:
The transaction has been committed on peer localhost:7053
查看該交易是否已寫(xiě)入,返回query.js并將參數(shù)從CAR4更改為CAR10。
換句話說(shuō),改變這一點(diǎn):
const request = { //targets : --- letting this default to the peers assigned to the channel chaincodeId: "fabcar", fcn: "queryCar", args: ["CAR4"] };
為這樣:
const request = { //targets : --- letting this default to the peers assigned to the channel chaincodeId: "fabcar", fcn: "queryCar", args: ["CAR10"] };
再次保存,然后查詢:
node query.js
應(yīng)該返回這些:
Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Nick"}
恭喜,你創(chuàng)造了一輛車(chē)!
所以現(xiàn)在我們已經(jīng)做到了,讓我們說(shuō)Nick感到很慷慨,他想把他的雪佛蘭伏特送給名叫Dave的人。
要做到這一點(diǎn),請(qǐng)返回invoke.js并將函數(shù)從createCar更改為changeCarOwner并輸入如下參數(shù):
var request = { //targets: let default to the peer assigned to the client chaincodeId: "fabcar", fcn: "changeCarOwner", args: ["CAR10", "Dave"], chainId: "mychannel", txId: tx_id };
第一個(gè)參數(shù) - CAR10 - 反映了將改變擁有者的汽車(chē),第二個(gè)參數(shù) - Dave - 定義了汽車(chē)的新?lián)碛姓摺?/p>
再次保存并執(zhí)行程序:
node invoke.js
現(xiàn)在讓我們?cè)俅尾樵兎诸?lèi)帳并確保Dave現(xiàn)在與CAR10鍵相關(guān)聯(lián):
node query.js
它應(yīng)該返回這個(gè)結(jié)果:
Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Dave"}
CAR10的所有權(quán)已從Nick改為Dave。
在現(xiàn)實(shí)世界的應(yīng)用程序中,鏈碼可能具有一些訪問(wèn)控制邏輯,例如,只有某些授權(quán)用戶可以創(chuàng)建新車(chē),并且只有車(chē)主可以將車(chē)轉(zhuǎn)移給其他人。總結(jié)
現(xiàn)在我們已經(jīng)完成了一些查詢和一些更新,你應(yīng)該非常清楚應(yīng)用程序如何與網(wǎng)絡(luò)交互,已經(jīng)看到了智能合約,API和SDK在查詢和更新中扮演的角色的基礎(chǔ)知識(shí),你應(yīng)該了解如何使用不同類(lèi)型的應(yīng)用程序來(lái)執(zhí)行其他業(yè)務(wù)任務(wù)和操作。
在隨后的文檔中,我們將學(xué)習(xí)如何實(shí)際編寫(xiě)智能合約,以及如何利用其中一些更低級(jí)別的應(yīng)用程序功能(特別是與身份和成員資格服務(wù)相關(guān))。
其他資源Hyperledger Fabric Node SDK repo是深入文檔和示例代碼的絕佳資源,你還可以在Hyperledger Rocket Chat上咨詢Fabric社區(qū)和組件專(zhuān)家。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24238.html
摘要:企業(yè)區(qū)塊鏈平臺(tái)企業(yè)級(jí)許可的分布式分類(lèi)賬平臺(tái),為廣泛的行業(yè)用例提供模塊化和多功能性。這些節(jié)點(diǎn)通過(guò)應(yīng)用已經(jīng)由共識(shí)協(xié)議驗(yàn)證的交易來(lái)維護(hù)分類(lèi)帳的副本,該交易被分組為包括將每個(gè)塊綁定到前一個(gè)塊的散列的塊中。 企業(yè)區(qū)塊鏈平臺(tái) 企業(yè)級(jí)許可的分布式分類(lèi)賬平臺(tái),為廣泛的行業(yè)用例提供模塊化和多功能性。 介紹 一般而言,區(qū)塊鏈?zhǔn)且粋€(gè)不可變的交易分類(lèi)賬,維護(hù)在一個(gè)分布式對(duì)等節(jié)點(diǎn)網(wǎng)絡(luò)中。這些節(jié)點(diǎn)通過(guò)應(yīng)用已經(jīng)由共...
摘要:還提供創(chuàng)建通道的功能,允許一組參與者創(chuàng)建單獨(dú)的交易分類(lèi)賬。共識(shí)交易必須按照發(fā)生的順序?qū)懭敕诸?lèi)賬,即使它們可能位于網(wǎng)絡(luò)中不同的參與者組之間。 介紹 Hyperledger Fabric是分布式分類(lèi)賬解決方案的平臺(tái),采用模塊化架構(gòu),提供高度機(jī)密性,彈性,靈活性和可擴(kuò)展性,它旨在支持不同組件的可插拔實(shí)現(xiàn),并適應(yīng)整個(gè)經(jīng)濟(jì)生態(tài)系統(tǒng)中存在的錯(cuò)綜復(fù)雜的事物和復(fù)雜性。 我們建議首次使用的用戶首先閱讀下...
摘要:和比特幣協(xié)議有所不同的是,以太坊的設(shè)計(jì)十分靈活,極具適應(yīng)性。超級(jí)賬本區(qū)塊鏈的商業(yè)應(yīng)用超級(jí)賬本超級(jí)賬本是基金會(huì)下的眾多項(xiàng)目中的一個(gè)。證書(shū)頒發(fā)機(jī)構(gòu)負(fù)責(zé)簽發(fā)撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開(kāi)始 一個(gè)故事告訴你比特幣的原理及運(yùn)作機(jī)制 這篇文章的定位會(huì)比較科普,盡量用類(lèi)比的方法將比特幣的基本原理講出來(lái)...
摘要:構(gòu)建你的第一個(gè)網(wǎng)絡(luò)方案提供了一個(gè)包含兩個(gè)組織的示例網(wǎng)絡(luò),每個(gè)組織維護(hù)兩個(gè)對(duì)等節(jié)點(diǎn),以及一個(gè)獨(dú)立排序服務(wù)。它還將啟動(dòng)一個(gè)容器來(lái)運(yùn)行腳本執(zhí)行,該執(zhí)行將對(duì)等點(diǎn)連接到一個(gè)通道,部署和實(shí)例化鏈碼并驅(qū)動(dòng)針對(duì)部署的鏈碼執(zhí)行交易。 構(gòu)建你的第一個(gè)網(wǎng)絡(luò) 這些說(shuō)明已經(jīng)過(guò)驗(yàn)證,可以與最新的穩(wěn)定Docker鏡像和提供的tar文件中預(yù)編譯的安裝實(shí)用程序一起工作,如果使用當(dāng)前主分支中的鏡像或工具運(yùn)行這些命令,則可...
摘要:在她的幫助下,原型發(fā)布順利完成。節(jié)點(diǎn)收到一個(gè)交易后,會(huì)根據(jù)判斷標(biāo)準(zhǔn)對(duì)該交易進(jìn)行有效性校驗(yàn),無(wú)效的交易會(huì)被廢棄。負(fù)責(zé)權(quán)限管理,成員身份相關(guān)證書(shū)管理和維護(hù)交易相關(guān)證書(shū)管理等等。 今天的文章來(lái)自Wen Aviva, 坐Jerry面對(duì)面的程序媛。 Jerry在之前的公眾號(hào)文章《在SAP UI中使用純JavaScript顯示產(chǎn)品主數(shù)據(jù)的3D模型視圖》已經(jīng)介紹過(guò)Aviva了,SAP成都C4C開(kāi)發(fā)團(tuán)...
閱讀 3000·2023-04-26 00:23
閱讀 3413·2021-09-13 10:28
閱讀 2198·2021-08-31 14:18
閱讀 2898·2019-08-30 15:54
閱讀 1955·2019-08-30 15:43
閱讀 1290·2019-08-29 16:56
閱讀 2816·2019-08-29 14:16
閱讀 2068·2019-08-28 17:51