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完成。