Skip to main content

Command Palette

Search for a command to run...

初探Solana程式接口描述 - Anchor IDL

Updated
•View as Markdown

如果你看過我之前寫的兩篇介紹文章 ( Solana小技巧 - 解構PDA數據結構 及 [Example study] Solana program Instruction data encoding ), 大概會感到無論是Instruction Data也好, 或Data Account數據也好, 也像是空有一堆bytes的盲盒。彷彿如果不是預先知道source code的話, 就不懂如何解讀甚或封裝數據。

在這缺口上, Anchor framework做了一個很造福人群的解決方案, 就是自帶提供了程式接口描述檔。


Anchor 生成的接口描述檔(IDL)

假設你的Solana Program是用Anchor來寫的, 當你在anchor build 建構程式時, 你會發現在./target/idl/ 下會生成出一個json檔。

這檔案稱為IDL (Interface Description Language), 是一個描述著程式的instructions接口﹑account結構類型的定義描述檔。

像這樣:

{
  "version": "0.1.0",
  "name": "XXXXXX",
  "instructions": [
    {
      "name": "registerKey",
      "accounts": [
        {
          "name": "signer",
          "isMut": true,
          "isSigner": true
        },

        ......
      ],
      "args": [
        {
          "name": "data",
          "type": {
            "defined": "RegisterKeyData"
          }
        }
      ]
    },

    ......

  ],
  "accounts": [
    {
      "name": "RegisterKeyData",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "keyAddress",
            "type": "publicKey"
          },
          {
            "name": "exp",
            "type": "u64"
          },
          {
            "name": "name",
            "type": "string"
          }
        ]
      }
    },

    ......

  ],
  "errors": [
    {
      "code": 6000,
      "name": "KeyNameTooLong",
      "msg": "key name too long"
    },

    ......

  ]
}

例如上例中可看到:

  • 定義了個名為registerKey的Instruction。

  • 這instruction需要引用到一堆accounts。

  • 這instruction的instruction data內容的type是 RegisterKeyData。

在"accounts"底下也能找到RegisterKeyData這個type的結構:

  • 第一個field是keyAddress, type是publicKey。

  • 第二個field是exp, type是u64。

  • 第二個field是name, type是string。

在"errors"底下也能看到error code描述。

餘此類推......

這描述檔不一定有齊所有接口資訊, 但已足夠讓人們去了解大致的數據結構了。

但如果我們是寫Solana program的, 是如何把這些資訊給公眾共享呢?

答案是, 我們能把它上傳到鏈上!


上傳IDL到鏈上, 在區塊鏈瀏覽器查看

使用 Anchor CLI , 就能把IDL上傳到鏈上。

然後在區塊鏈瀏覽器上查看程式的地址內容, 例如這個:
https://solscan.io/account/2FxWeRCPnvaxQpB4mMFDgW2nbCJm74BVKnJ27ARcfSdt?cluster=devnet#anchorProgramIDL

我們就能看到有Anchor Program IDL 與Accounts Data 這兩個tab了。圍繞IDL及數據的資訊都在這些tab之下了。

Anchor Program IDL 底下, 能看到Instructions, Accounts等資訊, 都是從IDL檔提取的資訊, 像是前面提及過的 registerKey 這instruction。

看那個Accounts 底下的RegisterKeyData , 不就是和之前我們看到的IDL那樣一樣嗎?

然後我們再看看Accounts Data 這個tab:

在這裡我們能選擇account, 然後粗略的查看到各account底下的真實數據。
從圖中可以直接看到數據,所以其實solscan是已經盡量幫我們做了數據解析的動作了。


如果你是在寫Solana的web3 client去call你的鏈上程式, 那你可以配合使用Anchor的JS client library:

https://www.npmjs.com/package/@coral-xyz/anchor

用這個去做的話, Anchor會幫你做了好些編碼及解析的功夫了。有興趣可以網上找找教學,但這篇文章就此略過了。

More from this blog

對web3將來方向的看法

我不太認同web3根本性在permissionless的.我認為根本性是多方共識結算infra,而這也在high level上可以是很中心化的事物.表明上矛盾但實際上可能是在不同層面體現而存在. 公鏈實際面貌就是permissionless的一片地如defi,以及一些中心化圈地如CEX.概看就是兩種地域.兩種也分別代表着不同意義的主流. 大交易所其實都是想往合規合法方向走,即圈地靠攏中心化,而且會慢慢形成中心化聯盟地帶.原因在於,將來大資本還是從傳統金融體制渡來,當是向錢看吧.羽翼未豐時,def...

Jul 9, 2024

Solana hackathon project - 暫名Solstage

近來忙著做Solana hackathon個project。(進度: 豐儉由人吧) 暫名: Solstage 背景/願景 用開solana wallet的人就會知, 其實長期wallet裡面有極多垃圾cNFT塞爆像垃圾崗那樣。所以我想做到有個機制是讓用戶可以自己去管理, 有哪些是重點NFT想show出來, 有哪些是沒那麼重要放在一邊, 以及有個junkbox可以不理。 網站會提供3個分類:- Stage (舞台)- Backstage (後台)- Junkbox (垃圾崗) "Stage"(舞台...

Mar 27, 2024
Solana hackathon project - 暫名Solstage

答問:DEFI做usdt/usdc質押有幾十%回報係咪正常?

答問:DEFI做usdt/usdc質押有幾十%回報係咪正常? Jpex果時我講過,咁係唔正常。但實際上不能太簡單一刀切,要再一步去睇。簡單說的話,的確這不是常態,但有時市況下會有短期波動project出短期幾十%年化,這是正常的非常態現像。 實際點,就要睇幾十%apy背後點黎。 1)坊間defi, 其年化背後其實是一種lending vs borrow資金池原理。當demand大,多人borrow,推高lending年化係有可能推高利率。 2)那麼demand大背後原因可能是什麼?可能市況向好,...

Feb 28, 2024

eric.dev.blog

37 posts