本篇轉載於:https://mp.weixin.qq.com/s/xwFhLISx2Pdi7p3u4Tn0IA
gear-js 是Gear 的js SDK,通過這個工具我們可以連接節點,上傳合約,發送交易,還有解析Gear 合約等。
我們經常使用的https://idea.gear-tech.io/最核心的功能就是由gear-js 提供支持的。
現在我們以erc20 合約為例子,介紹gear-js。
如何安裝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()} ` ) })
具體代碼請參考: 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})
具體代碼請參考: 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)
具體代碼請參考: 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) });
具體代碼請參考: 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 的事件非常多,我們重點關注MessageDispatched
、 Log
。
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))
具體代碼請參考: https://github.com/GearFans/example/blob/main/src/event.ts
關於GearFans
Gear 是波卡生態的計算組件,GearFans 是Gear 愛好者社區。
- 官網: https://gear-tech.io/
- Twitter: https://twitter.com/gear_techs
- GitHub: https://github.com/gear-tech
- Discord: https://discord.com/invite/7BQznC9uD9
- Medium: https://medium.com/@gear_techs
- Telegram 群: https://t.me/gear_tech
- Telegram 中文群: https://t.me/Gear_CN
- Telegram 中文開發群: https://t.me/gear_dev_cn