Hyperledger Fabric學習筆記——應用程序與智能合約交互

1、基本流程

下圖簡單地展示了一個應用程序通過SDK調用商業票據智能合約的過程:

2、Wallet

Wallet中的X.509數字證書將組織和持有者聯繫起來,使得持有者能夠有權限連接到網絡,不同的持有者身份擁有不同的權限,並且智能合約可以在執行期間通過transaction context獲得這個身份。wallet中不存放任何現金或代幣,只存放身份。

應用程序使用FileSystemWallet和Gateway類連接到區塊鏈網絡,在issue.js的最上面可以看到包括了這兩個類。

const { FileSystemWallet, Gateway } = require('fabric-network');

應用程序使用Wallet類:

const wallet = new FileSystemWallet('../identity/user/isabella/wallet');

3、Gateway

issue.js連接到它的的網關:

await gateway.connect(connectionProfile, connectionOptions);

gateway.connect()有兩個重要參數:

connectionProfile:標識了一系列對等節點網關的connection profile文件的系統位置。爲了方便讀使用了YAML,通過下面的代碼加載轉換爲JSON對象。

let connectionProfile = yaml.safeLoad(file.readFileSync('./gateway/connectionProfile.yaml', 'utf8'));

connectionOptions:一系列用來控制issue.js(應用程序代碼)如何連接到區塊鏈網絡的設置。它指定了連接到網關需要的了身份,userName和wallet,還可以通過SDK實現一些智能的行爲。

let connectionOptions = {
  identity: userName,
  wallet: wallet,
  eventHandlerOptions: {
    commitTimeout: 100,
    strategy: EventStrategies.MSPID_SCOPE_ANYFORTX
  },
}

網關負責使用connect profile和connection options將transaction提議發送到正確的對等節點上。

4、Network channel

網關connectionProfile.yaml配置文件中定義的peers提供了issue.js接入PaperNet的途徑,因爲這些對等點可以加入多個網絡通道,因此網關實際上提供了應用程序接入多個網略通道的途徑。

應用程序選擇特定的某個通道:

const network = await gateway.getNetwork('PaperNet');

應用程序可以加入網絡中的一個子網絡,通過連接到多網關的對等點。每個對等點加入到多個網絡通道中,應用程序根據它們不同的wallet身份在不同的通道中有不同的權限。

5、構建一個提議

應用程序直接連接到CommercialPaperContract這個智能合約:

const contract = await network.getContract('papercontract', 'org.papernet.commercialpaper');

papercontract.js是一個包含多個智能合約的鏈碼文件,papercontract是該鏈碼文件安裝和部署在通道上的名字,通過智能合約的名稱從papercontract.js鏈碼中選出需要的智能合約。getContract()方法會默認使用它發現的鏈碼上的第一個智能合約,因此當鏈碼中只有一個智能合約時,可以省略合約名。

6、提交transaction提議

提交transaction提議是對SDK一個單獨的方法調用:

const issueResponse = await contract.submitTransaction('issue', 'MagnetoCorp', '00001', '2020-05-31', '2020-11-30', '5000000');

看起來好像是智能合約在應用程序調用submitTransaction()後很快就獲得了控制權,但事實並不是這樣。在幕後,SDK使用connectionOptions和connectionProfile來將transaction提議發送到網絡中正確的節點上。但是應用程序並不用管這些,只需要發起submitTransaction然後SDK完成剩下的所有操作。

注意,submitTransactionAPI包括了一個監聽transaction提交的進程,這是有必要的,因爲如果沒有就無法知道transaction是否已經成功地完成排序,驗證並提交到賬本中。

7、處理響應

和transaction提議一樣,可能看起來應用程序在智能合約調用後很快獲得了控制權,但是事實並不是這樣,同樣背後的共識等過程由SDK完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章