本篇轉載於:https://mp.weixin.qq.com/s/xwFhLISx2Pdi7p3u4Tn0IA

gear-js 是Gear 的js SDK,通過這個工具我們可以連接節點,上傳合約,發送交易,還有解析Gear 合約等。

我們經常使用的https://idea.gear-tech.io/最核心的功能就是由gear-js 提供支持的。

現在我們以erc20 合約為例子,介紹gear-js。

e1f03b7c0730efb538feeddb786ed5a0.png

如何安裝gear-js

 npm install @gear-js/api或者yarn add @gear-js/api

開始

 import { GearApi } from ' @gear -js/api'

連接到rpc 節點,並獲取節點信息

在網站左側可以看到切換rpc 連接,並且可以看到最新的區塊信息。通過nodeName subscribeToNewBlocks就可以輕鬆做到。

 const rpc = 'wss://rpc-node.gear-tech.io' const gearApi = await GearApi.create({ providerAddress: rpc }) const chain = await gearApi.chain() const nodeName = await gearApi.nodeName() const nodeVersion = await gearApi.nodeVersion() console .log( `You are connected to chain ${chain} using ${nodeName} v ${nodeVersion} ` ) // 获取最新块信息await gearApi.gearEvents.subscribeToNewBlocks( ( header ) => { console .log( `New block with number: ${header. number .toNumber()} and hash: ${header.hash.toHex()} ` ) })  

ce265b02d69c6b3d501560a0623da6a5.png

具體代碼請參考: https://github.com/GearFans/example/blob/main/src/connect.ts

獲取wasm 合約的元數據

https://idea.gear-tech.io/很重要的功能是上傳合約,我們先考慮如何解析合約。

 import { getWasmMetadata } from '@gear-js/api' const fileBuffer = fs.readFileSync( 'path/to/program.meta.wasm' ) const meta = await getWasmMetadata(fileBuffer) console .log({meta})  

c410add8a0e8d408b715e3433354042c.png

具體代碼請參考: https://github.com/GearFans/example/blob/main/src/metadata.ts

獲取賬戶

我們上傳合約、發送信息的前提,是我們要有1 個賬戶。

 // 创建一个新的keyring const { keyring, json } = await GearKeyring.create( 'keyringName ') // 从JSON 文件得到keyring const jsonKeyring = fs.readFileSync( 'path /to/keyring.json').toString() const keyring = GearKeyring.fromJson(jsonKeyring)  

bea53e3cbd28abdeb4ef642939130252.png

具體代碼請參考: https://github.com/GearFans/example/blob/main/src/key.ts

上傳合約

有了賬戶,我們上傳合約, initPayload是非常重要的參數,發送成功後,我們會獲得programId。

 const code = fs.readFileSync( 'path/to/program.wasm' ) const somePayload = { name: 'GearFans Token' , symbol: 'GFT' } const uploadProgram = { code, gasLimit: 1 _000_000, value: 0 , initPayload: somePayload }; const programId = await gearApi.program.submit(uploadProgram, meta) await gearApi.program.signAndSend(keyring, ( data ) => { console .log(data) });  

81e3afb3b70d2fab97e12120edb4a7bc.png

具體代碼請參考: https://github.com/GearFans/example/blob/main/src/upload.ts

發送消息

mint

Gear 調用任何方法,都需要發送信息。我們用erc20 的mint 方法作為例子。

 const payload = { 'mint' : { 'account' : '5CyREBErNFhogptd92dtC8ybuoUczVYh2ijvdhTpS2PJGeq7' , 'amount' : '1000' , } } const message = { destination: programId, // programId payload: payload, gasLimit: 1 _000_000, value: 0 } await gearApi.message.submit(message, meta) await gearApi.message.signAndSend(keyring, ( data ) => { console .log(data) }) 

balanceOf

如何調用balanceOf,我們修改payload 就可以。

 const payload = { 'BalanceOf' : '5CyREBErNFhogptd92dtC8ybuoUczVYh2ijvdhTpS2PJGeq7' }

具體代碼請參考:

https://github.com/GearFans/example/blob/main/src/mint.ts

https://github.com/GearFans/example/blob/main/src/balanceof.ts

獲取事件

發送完事件後,我們要接受事件,查看結果。

Gear 的事件非常多,我們重點關注MessageDispatchedLog

 const rpc = 'wss://rpc-node.gear-tech.io' const gearApi = await GearApi.create({ providerAddress: rpc }) gearApi.allEvents((events) => { events.forEach( async ({ event: { data, method } }) => { if (method == 'MessageDispatched' ) {} if (method == 'Log' ) {} }) }) 

獲得log 後,我們要繼續解析log 內的數據。

 let decoded = CreateType.decode( type , payload, meta) console .log( JSON .stringify(decoded)) 

6153a136d7acb0c0f4cf78dcacd7e750.png

具體代碼請參考: https://github.com/GearFans/example/blob/main/src/event.ts


關於GearFans

Gear 是波卡生態的計算組件,GearFans 是Gear 愛好者社區。