理解TON合約中的訊息傳送結構

若-飞發表於2024-10-12

在開發TON合約時,訊息的傳送格式非常關鍵。特別是在使用TypeScript與TON合約互動時,我們會遇到這樣的程式碼片段:

async send(provider: ContractProvider, via: Sender, args: { value: bigint, bounce?: boolean | null | undefined }, message: string | Deploy) {
    let body: Cell | null = null;
    if (typeof message === 'string') {
        body = beginCell().storeUint(0, 32).storeStringTail(message).endCell();
    }
    if (message && typeof message === 'object' && !(message instanceof Slice) && message.$$type === 'Deploy') {
        body = beginCell().store(storeDeploy(message)).endCell();
    }
    if (body === null) { throw new Error('Invalid message type'); }
    
    await provider.internal(via, { ...args, body: body });
}

為什麼需要storeUint(0, 32)

  1. 訊息結構

    • TON的訊息遵循特定的格式,確保傳送的資訊可以被接收方正確解析。使用beginCell().storeUint(0, 32)來定義訊息的型別或識別符號。
  2. 型別標識

    • 在這裡,storeUint(0, 32)通常表示訊息的型別。接收合約可以透過檢查這個識別符號來判斷如何處理後續的資料。例如,值為0可能表示這是一個普通的字串訊息
  3. 可擴充套件性

    • 這種結構使得訊息在未來可以靈活擴充套件。如果後續需要增加更多的資訊或型別,只需改變storeUint的值或增加更多欄位即可。
  4. 遵循協議規範

    • TON的訊息傳遞有其特定的協議和規範,遵循這些規範可以確保合約之間的相容性和可預測的行為。

結論

在傳送字串訊息時,使用storeUint(0, 32)不僅僅是一個技術細節,它在訊息的解碼和處理過程中起著至關重要的作用。理解這些細節有助於我們在開發TON合約時編寫更加高效、可靠的程式碼。希望這個解讀能幫助你更好地理解TON合約中的訊息結構!

相關文章