超級賬本 開發應用 應用程式設計元素

2021-10-09 21:50:18 字數 3170 閱讀 3315

注:素材來自超級賬本官方文件

本節詳細介紹了 hyperledger fabric 中的客戶端應用程式和智慧型合約開發的主要功能。對功能的充分理解將幫助您設計和實現高效且有效的解決方案。

受眾:架構師、應用程式與合約開發者、管理員

鏈碼(chaincode)是一種用於部署**到 hyperledger fabric 區塊鏈網路中的通用容器。鏈碼中定義乙個或多個相關聯的智慧型合約。每個智慧型合約在鏈碼中有乙個唯一的標識名。應用程式通過合約名稱去訪問已經例項化的鏈碼內指定的智慧型合約。

在本主題中,我們將會講到:

智慧型合約(smart contract)是一種高階程式設計抽象的例子,可以在鏈碼容器中定義智慧型合約。當乙個鏈碼被安裝到 peer 節點並部署到通道後,鏈碼內所有的智慧型合約對你的應用來說都是可用的。

多個智慧型合約能夠被定義在同乙個鏈碼內。每乙個智慧型合約都通過鏈碼內的名字而被唯一標識。

在上圖中,鏈碼 a 中定義了三個智慧型合約,然而鏈碼 b 中有四個智慧型合約。看一下鏈碼名稱如何被用於限定乙個特定的智慧型合約。

在大多數情況下,乙個鏈碼內僅僅只定義了乙個智慧型合約。然而,將相關聯的智慧型合約放在乙個鏈碼中是有意義的。比如,以不同貨幣計價的商業票據中,可能有euro*****contract, dollar*****contract, yen*****contract,這些智慧型合約在部署他們的通道內可能要互相保持同步。

鏈碼裡的每乙個智慧型合約都通過合約名稱被唯一標識。當智慧型合約可以在構造類時顯示分配這個名稱,或者讓contract類隱式分配乙個預設名稱。

檢視*****contract.js鏈碼檔案:

class commercial*****contract extends contract
看一下 commercial*****contract 建構函式是如何將合約名稱指定為 org.*****net.commercial***** 的。結果是:在 *****contract 鏈碼內,這個智慧型合約現在與合約名 org.*****net.commercial***** 相關聯。

如果沒有明確指定乙個合約名,則會分配乙個預設的名字——類名。在我們的例子中,預設的合約名是 commercial*****contract。

細心地選擇你的名字。不僅僅每乙個智慧型合約必須有乙個唯一的名字,而且乙個精心挑選的名字也是很有啟發性的。特別地,建議使用顯式的 dns 樣式命名方法,對組織清晰、有意義的名稱有幫助; org.*****net.commercial***** 表達了 *****net 網路已經定義了乙個標準的商業票據智慧型合約。

在乙個給定鏈碼內,合約名稱也有利於消除具有相同名字的不同合約方法交易函式之間的歧義。當智慧型合約緊密聯絡的時候,這種歧義就容易發生;他們的交易名稱往往傾向於一致。我們能夠看到,通過鏈碼和智慧型合約的名字的組合,乙個交易被唯一地定義在通道內。

合約名稱在鏈碼檔案內必須是唯一的。在部署前,一些**編輯器將會檢測是否存在具有相同類名的多個定義的情況。如果存在多個類使用了相同的合約名,無論是顯式還是隱式指定,鏈碼都將會返回錯誤。

一旦鏈碼安裝在乙個 peer 節點而且部署在乙個通道上,鏈碼裡的智慧型合約對於應用程式來說是可訪問的:

const network = await gateway.getnetwork(

`*****net`);

const contract = await network.getcontract(

'*****contract', 'org.*****net.commercial*****');

const issueresponse = await contract.submittransaction(

'issue', 'magnetocorp', '00001', '2020-05-31', '2020-11-30', '5000000'

);

看一下應用程式如何通過network.getcontract()方法訪問智慧型合約。*****contract鏈碼的名org.*****net.commercial*****返回了乙個引用,此引用使用contract.submittransaction()介面去提交發布商業票據的交易。

被定義在鏈碼內的第乙個智慧型合約被成為預設合約。這個預設是有用的,因為鏈碼內往往有乙個被定義的智慧型合約;這個預設的智慧型合約允許應用程式直接地訪問這些交易,而不需要特殊指定合約名稱。

乙個預設地智慧型合約是第乙個被定義在鏈碼的智慧型合約。

在這個圖表中,commercial*****contract就是那個預設的智慧型合約。即使我們有兩個智慧型合約,預設的智慧型合約讓我們當前的例子更加容易去編寫。

const network = await gateway.getnetwork(

`*****net`);

const contract = await network.getcontract(

'*****contract');

const issueresponse = await contract.submittransaction(

'issue', 'magnetocorp', '00001', '2020-05-31', '2020-11-30', '5000000'

);

*****contract鏈碼內,commercial*****contract就是那個預設的智慧型合約,同時它有乙個issue交易。注意,在bondcontract內發布的交易事務僅僅能通過顯示地定址指來呼叫。同樣地,即使cancel交易是唯一的(因為bondcontract不是預設的智慧型合約),它也必須要顯示地定址。

在大多數情況下,乙個鏈碼僅僅只包括乙個單一的智慧型合約,所以對鏈碼仔細命名,能夠降低開發者將鏈碼視為概念來關注的需求。在上述**例子中,感覺*****contract像是乙個智慧型合約。

IAP 應用程式設計

1 檢查是否需要對第二部分 進行更新 2 如果不需要更新則轉到4 3 執行更新操作 4 跳轉到第二部分 執行 第一部分 必須通過其它手段,如jtag或isp燒入 第二部分 可以使用第一部分 iap功能燒入,也可以和第一部分 一道燒入,以後需要程式更新是再通過第一部分iap 更新。對於stm32來說,...

串列埠應用程式設計

include include 標準輸入輸出定義 include 標準函式庫定義 include unix 標準函式定義 include include include 檔案控制定義 include ppsix 終端控制定義 include 錯誤號定義 include include include...

DirectShow應用程式設計介紹

這篇文章包含兩方面內容 filter graphs 寫乙個dshow應用程式 一 filter graphs dshow的基本軟構件塊是一種叫做filter的元件。a filter一般只執行基於多 資料上的單一的操作。例如,有一些dshow filter有如下功能 1 讀檔案 2 3 為某一種流格式...