全部產品
Search
文件中心

:JS SDK 快速開始

更新時間:Jul 06, 2024

本文以 0.2.27 版本的 JS SDK 為例,通過樣本闡述如何快速使用 JS SDK 進行合約開發。

說明

JS SDK 0.3.8 與 0.2.27 版本保持相容,本快速開始同時適用於以上兩個版本。

準備環境

安裝 SDK

  • Node.js 官網 下載並安裝 Node.js(推薦使用v10以上v16以下版本)。

  • 安裝 JS SDK。下載 JS SDK V0.2.27 安裝包 至專案目錄,然後在專案目錄中安裝。

      npm i alipay-mychain-0.2.27.tgz --save

準備 SSL 串連檔案

要與 BaaS 平台建立 SSL 串連,需準備三個認證檔案:ca.crtclient.keyclient.crt

如果您尚未在合約鏈申請認證,可按照 試用合約體驗鏈 的操作說明去產生和申請認證相關檔案。

檔案

說明

來源

ca.crt

合約鏈的認證 CA,用戶端用來驗證合約鏈服務身份

通過 BaaS 平台下載。

client.key

RSA 密鑰

通過 BaaS 提供的 密鑰產生工具 產生。

client.crt

RSA 認證,與 client.key 是一對

使用 BaaS 提供的 密鑰產生工具 產生認證請求檔案 client.csr,提交請求檔案到 BaaS 平台申請認證,申請成功後可下載此 .crt 檔案。

準備合約鏈的賬戶

在合約鏈上提交交易時,需要使用一個已經在鏈上存在的賬戶,JS SDK 需要使用賬戶的 賬戶名稱私密金鑰檔案

賬戶可通過 BaaS 平台申請建立。參考 試用合約體驗鏈 的過程,需要填寫建立的賬戶名稱、賬戶公開金鑰和恢複公開金鑰,其中與賬戶公開金鑰對應的 user.key 檔案就是賬戶的私密金鑰檔案,對此私密金鑰檔案進行轉換,方便在 JS SDK 中使用。

openssl ec -in user.key -passin pass:${key_password} -passout pass:${key_password} -aes256 -out user.pem
說明

將 ${key_password} 替換為私密金鑰密碼。

擷取鏈節點 IP 和連接埠號碼

要與合約鏈互動,您需要擷取鏈節點的 IP 位址和連接埠號碼。在 BaaS 平台,通過查看目標合約鏈詳情,在區塊瀏覽器中查看節點詳情,可擷取鏈節點的 IP 位址和連接埠號碼。

使用 JS SDK

快速建立一個訪問區塊鏈的執行個體 chain,並使用 QueryLastBlock 驗證該執行個體與區塊鏈節點的串連狀況。

const Chain = require("@alipay/mychain/index.node") //在 node 環境使用 TLS 協議
const fs = require("fs")

const accountKey = fs.readFileSync("./certs/user.pem", { encoding: "utf8" })
const accountPassword = "123abc"  //需要替換為自訂的 user.pem 密碼

const keyInfo = Chain.utils.getKeyInfo(accountKey, accountPassword)
//可列印私密金鑰和公開金鑰,使用 16 進位
//console.log('private key:', keyInfo.privateKey.toString('hex'))
//console.log('public key:', keyInfo.publicKey.toString('hex'))

const passphrase = "123abc" //需要替換為自訂的 client.key 密碼
//配置選項
let opt = {
  host: '127.0.0.1',    //目標區塊鏈網路節點的 IP
  port: 18130,          //連接埠號碼
  timeout: 30000,       //連線逾時時間配置
  cert: fs.readFileSync("./certs/client.crt", { encoding: "utf8" }),
  ca: fs.readFileSync("./certs/ca.crt", { encoding: "utf8" }),
  key: fs.readFileSync("./certs/client.key", { encoding: "utf8" }),
  userPublicKey: keyInfo.publicKey,
  userPrivateKey: keyInfo.privateKey,
  userRecoverPublicKey: keyInfo.publicKey,
  userRecoverPrivateKey: keyInfo.privateKey,
  passphrase: passphrase
}

//初始化一個串連執行個體
const chain = Chain(opt)

//調用 API 查詢最新的一個區塊資料
chain.ctr.QueryLastBlock({}, (err, data) => {
  console.log('raw data:', data)                                     //區塊結構資料
  console.log('block hash:', data.block.block_header.hash)             //區塊雜湊
  console.log('block number:', data.block.block_header.block_number) //區塊高度
})

成功運行結果參考:

raw data: { msg_type: 58,
  sequence: 1,
  return_code: 0,
  group_id: '0x0000000000000000000000000000000000000000',
  block:
   { block_header:
      { hash:
         '0xe99d8958a45e8c87a7b10efc259828f06fe083995be52997f5d310f2b6d073a6',
        version: 2,
        block_number: 84265,
        parent_hash:
         '0x918b263a8e6c6fff594b89570970ef4bef24cf93aeed5347f7b250b070857c4b',
        transaction_root:
         '0x0000000000000000000000000000000000000000000000000000000000000000',
        receipt_root:
         '0x0000000000000000000000000000000000000000000000000000000000000000',
        state_root:
         '0x9f71cb9ce960e5637bad6da5be8daa2d7e557942208f241a60589b2de98e6c71',
        gas_used: 0,
        timestamp: 1547382477852,
        log_bloom:
         '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' },
     block_body:
      { transaction_list: [],
        receipt_list: [],
        consensus_proof:
         '0xf8f2f8c9b8419746989382c1613c6c3ce98bf79ac92a8d69952c22f4064194869c53b4075d517cfc98eda861212687e49b186c08d196770bd356762fa2a88d0288c0556f271a01b84138a97446a75c76a31d24880c343407bd7bc24608685c494240ac603cad62201a01a423718661b24e517ee6f6b2fee6d356b57833305860700cca81b0238f870400b841eaf508392d9098a3e7fb46f6f7aa4b53311e5a0d13e300d02025af7453ea130a6c27407c1da254578cae80ed498d4807587883f837c1716b0be8ae02cf955d6000e61e83014929a0e200d8bee723d820022d5c5a1f8fe6b521c0a4fff0b5ec03a7c6061276d68b58' } },
  api: 'QueryLastBlock' }
block hash: 0xe99d8958a45e8c87a7b10efc259828f06fe083995be52997f5d310f2b6d073a6
block number: 84265
說明

運行結果樣本中包含欄位 return_code,此欄位結果為 0,表示執行成功,否則其值為錯誤碼。後文介紹的交易回執(receipt)中 result 欄位也是類似含義,詳細錯誤碼資訊參見合約鏈錯誤碼

JS SDK 引用說明

不同運行環境下, JS SDK 的引用方式稍有不同:

  • Node 環境:

      const Chain = require("@alipay/mychain/index.node")
  • Web 環境:

      const Chain = require("@alipay/mychain")

配置項說明

在初始化與區塊鏈串連的執行個體之前,可進行選項配置,各配置項的具體說明如下。

說明

如無特別說明,配置項的資料類型預設為 string 類型。 配置項中配置了賬戶相關的 Key 資訊,包括賬戶公私密金鑰、賬戶恢複公私密金鑰。鏈的串連執行個體預設使用配置項中的賬戶 Key 資訊進行交易簽名。如果要切換賬戶,需要重新設定賬戶 Key 相關選項。詳情參見建立賬戶中切換賬戶配置的使用樣本。

配置項

必填

配置說明

樣本值

host

true

區塊鏈節點的 IP 或者主機名稱。使用 TLS 時為 IP 位址;使用 HTTPS 時為主機名稱。

127.0.0.1https://www.alipay.comhttps://127.0.0.1

port

true

區塊鏈節點開放串連的連接埠號碼,類型為 number。

18130

clients

false

可設定多個 host:port,作為主節點(首個為主節點),次節點備份,當主節點出現串連問題,SDK 會切換到列表其它節點重試串連。如果配置此參數,可不用設定 host 和 port 參數。

[{host:’127.0.0.1’,port:18130},

{host:’127.0.0.2’,port:18130}]

timeout

true

與區塊鏈節點串連的逾時時間配置,單位毫秒,類型為 number。

30000

ca

true

目標合約鏈的根憑證。

在 BaaS 平台申請通過後下載,詳情參考 試用合約體驗鏈

cert

true

用戶端認證檔案。

在 BaaS 平台申請通過後下載,詳情參考 試用合約體驗鏈

key

true

用戶端產生的私密金鑰檔案,用於產生認證請求檔案,進而申請認證。

使用 BaaS 提供 密鑰產生工具 產生,詳情參考 試用合約體驗鏈

userPublicKey

true

賬戶公開金鑰,字串內容為 16 進位。

0x971c77d38bf220572fe8294d7884b184adeeb9bac4d61c1b3e1e924575e526152145763eaba40c8713c82cc2961fba98f71c8b93984d4e3d10b2ff53ea039551

userPrivateKey

true

賬戶私密金鑰,字串內容為 16 進位。

0x4015e39643765014b874dbd35a53f1a01418c66f7c47da35f3a84122c743d9a3

userRecoverPublicKey

true

賬戶恢複公開金鑰,字串內容為 16 進位。

0xb961f6a1a43b9e7aa368be8d093ed7bec2d0ff85ff7646ec968d86bd546151efbd037cfe09933684b5c98978a1593074cdff465de3a3620089f5634911bf7b2e

userRecoverPrivateKey

true

賬戶恢複私密金鑰,字串內容為 16 進位。

0x44a973e5286f1d3513561360bb0214235425b942a4649c7d371f780ca1ee0e80

passphrase

true

TLS 或 HTTPS 連結的 client.key 檔案的自訂密碼。

123abc

checkServerIdentity

false

針對 TLS 協議的配置,類型為 boolean,含義為是否啟用對服務端 hostname 的檢查,即對比服務端認證的 CN 欄位與 hostname 是否匹配,預設值為 false。

false

tx_querycount

false

對於交易類型,提交交易後會調用 QueryTransactionReceipt 查詢收據,此配置可設定重試的次數,類型為 number,預設值為 3。

5

tx_querytime

false

對於交易類型,提交交易後會調用 QueryTransactionReceipt 查詢收據,此配置可設定重試的時間間隔,類型為 number,單位為毫秒,預設值為 3000。

200