從風險到保護:TON智能合約的安全風險和優化建議

中級9/18/2024, 6:20:19 PM
探索TON區塊鏈平台的智能合約功能,包括其獨特的異步消息機制、賬戶模型和燃氣費模型。本文詳細分析了TON區塊鏈架構,包括主鏈、工作鏈和分片鏈的設計,以及它們如何共同工作以增強網絡吞吐量和可擴展性。它還強調了編寫智能合約時需要注意的安全問題,並提供了實用建議和最佳實踐,以幫助開發人員避免常見的安全漏洞。

在快速發展的區塊鏈技術領域中,TON(The Open Network)作為一個高效靈活的區塊鏈平台,越來越受到開發者的關注。TON獨特的架構和功能為去中心化應用的開發提供了強大的工具和豐富的可能性。

然而,隨著功能和複雜性的增加,智能合約的安全性變得更加重要。TON上的智能合約編程語言FunC以其靈活性和效率而聞名,但也存在許多潛在的風險和挑戰。撰寫安全可靠的智能合約需要開發人員對FunC的特性和潛在風險有深入了解。

本文將詳細分析TON區塊鏈上與智能合約相關的功能,以及通常被忽略的TON智能合約中的漏洞。

分析TON的異步功能和帳戶機制

智能合約中的非同步調用

網絡分片和異步通信

TON區塊鏈設計有三種類型的鏈:主鏈,工作鏈和分片鏈。

主鏈是整個網路的核心,負責存儲整個網路的元數據和共識機制。它記錄所有工作鏈和分片鏈的狀態,並確保網路一致性和安全性。工作鏈是獨立的區塊鏈,最多有2^32條鏈,負責處理特定類型的交易和智能合約。每個工作鏈都可以有自己的規則和功能,以滿足不同的應用需求。分片鏈是工作鏈的子鏈,用於進一步劃分工作鏈的工作量,增強處理能力和可擴充性。每個工作鏈最多可以拆分為2^60個分片鏈,分片鏈獨立處理一些交易,實現高效的並行處理。

理論上,每個帳戶可以獨占一個Shardchain,每個帳戶獨立維護其COIN/TOKEN餘額。帳戶之間的交易可以完全並行。帳戶通過異步消息進行通信,消息在Shardchains之間傳遞的路徑是log_16(N)-1,其中N是Shardchains的數量。


圖片來源:https://frontierlabzh.medium.com/ton-weixin-e1d3ae3b3574在 Ton 的 web3 世界中,交互是通過發送和接收消息進行的。這些消息可以是內部的(通常由智能合約相互作用發送)或外部的(由外部來源發送)。消息傳遞過程不需要目標合約的即時響應,允許發件人繼續執行其餘邏輯。這種異步消息傳遞機制與以太坊的同步呼叫相比,提供了更大的靈活性和可擴展性,減少了因等待響應而導致的性能瓶頸,同時也引入了處理並發和競態條件的挑戰。

消息格式和結構

在TON中,消息通常包括發送者、接收者、金額和消息正文等信息。消息主體可以包含函數調用、數據傳輸或其他自定義內容。TON的消息格式設計靈活且可擴展,可以有效地在不同合約之間傳遞各種類型的信息。

消息隊列和狀態處理

每個合約都維護一個消息隊列,用於存儲尚未處理的消息。在執行期間,合約從隊列中逐一處理消息。由於消息處理是異步的,合約的狀態在收到消息後不會立即更新。

異步消息傳遞的優勢

•高效的分片機制:TON的非同步機制與其分片設計高度兼容。每個分片獨立處理合約訊息和狀態變化,避免了跨分片同步引起的延遲。這種設計增強了整個網絡的吞吐量和可擴展性。

•減少資源消耗:異步消息不需要立即回應,允許TON合約在多個區塊中執行,避免在單個區塊內過度消耗資源。這使得TON能夠支持更複雜和資源密集型的智能合約。

•容錯和可靠性:異步消息傳遞機制提高了系統的容錯能力。例如,如果由於資源限制或其他原因,合約無法及時回應消息,發送者可以繼續處理其他邏輯,防止系統因單個合約延遲而停滯不前。

非同步合約設計的挑戰

•状态一致性问题:由于消息传递的异步性,合约可能在不同的时间接收到不同的消息,这需要开发人员特别注意状态的一致性。在设计合约时,关键是考虑不同的消息顺序可能会影响状态变化,并确保系统在所有情况下保持一致。

•競態條件和保護:非同步消息處理引入潛在的競態條件問題,多個消息可能同時嘗試修改合約狀態。開發人員需要實施適當的鎖定機制或使用事務操作來防止狀態衝突。

•安全注意事項:當處理跨合約通訊時,異步合約容易受到中間人攻擊或重放攻擊等風險的影響。因此,在設計異步合約時,必須考慮這些潛在的安全風險並採取預防措施,例如使用時間戳記、隨機數或多重簽名方法。

分類帳模型

TON(The Open Network)在設計其區塊鏈基礎設施時採用了獨特的賬戶抽象和分類帳模型。該模型的靈活性體現在它如何管理賬戶狀態、消息傳遞和合約執行。

帳戶抽象化

TON的賬戶模型使用基於合約的抽象,每個賬戶可以被視為一個合約。這與以太坊的賬戶抽象模型有些相似,但更靈活和通用。在TON中,賬戶不僅僅是資產的容器;它們還包括合約代碼和狀態數據。每個賬戶都包含其代碼、數據和消息處理邏輯。

帳戶結構: 每個TON帳戶都有一個唯一的地址,該地址是從帳戶代碼的哈希值、部署時的初始數據和其他參數的組合生成的。這意味著在不同的環境中(例如不同的區塊鏈或分片)部署相同的代碼和初始數據可能會產生不同的地址。

靈活性:由於每個帳戶都可以執行自己的合約代碼,因此TON帳戶可以實現非常複雜的邏輯。帳戶不僅僅是簡單的餘額持有者,還可以處理複雜的狀態轉換、帳戶間消息通信,甚至基於特定條件的自動化。這使得TON的帳戶模型與傳統的區塊鏈帳戶模型相比更具可擴展性和靈活性。

帳本結構

TON的帳本結構設計為有效處理大規模並行交易,支援異步消息傳遞和多分片操作。每個帳戶的狀態存儲在默克爾樹結構中,提供了有效的狀態驗證能力。

狀態存儲

帳戶狀態信息存儲在持久存儲中,並通過 Merkle 樹進行組織,以確保完整性和安全性。該設計還支持對狀態的高效查詢和驗證,特別是在跨 shard 交易中。

帳戶或智能合約的狀態通常包括以下內容:

  1. 基本貨幣餘額 2. 其他貨幣餘額 3. 智能合約代碼(或其哈希) 4. 智能合約的持久數據(或其 Merkle 哈希) 5. 持久存儲單元數量和原始字節使用情況的統計數據 6. 最近支付給智能合約持久存儲的時間戳(基本上是主鏈區塊編號) 7. 從此帳戶轉移貨幣和發送消息所需的公鑰(可選;默認情況下,此公鑰等於帳戶 ID)。在某些情況下,此處可能還可以找到更複雜的簽名檢查代碼,類似於比特幣交易輸出;在這種情況下,帳戶 ID 將是此代碼的哈希值。

並非每個帳戶都需要所有信息。例如,智能合約代碼只與智能合約有關,而不適用於“簡單”帳戶。此外,雖然每個帳戶必須具有基本貨幣(例如基本工作鏈和分片鏈的 Gram)的非零餘額,但其他貨幣餘額可能為零。為了避免保留未使用的數據,在創建工作鏈時定義了一種總乘積類型,使用不同的標記字節來區分各種“構造函數”。最終,帳戶狀態被保存為TVM持久存儲中的一組單元。

消息傳遞和處理

TON的帳本結構包括內置支持異步消息傳遞。每個帳戶可以獨立處理接收的消息並更新其狀態。這種異步消息傳遞機制允許帳戶之間進行復雜的交互,而不會因為任何單個操作的延遲而影響其他帳戶的正常運作。

氣體模型

TON(The Open Network)透過其獨特的燃氣費用模型顯著優化智能合約的執行效率。該燃氣費用模型用於測量和限制智能合約執行期間消耗的資源。與傳統的區塊鏈(如以太坊)相比,TON的模型更複雜、更高效,允許更精確地管理合約執行期間的資源消耗。

TON的gas模型可以準確地測量智能合約執行期間消耗的計算資源、存儲操作和消息傳遞成本。通過為計算、存儲和消息等資源提供詳細的測量,TON的gas模型可以防止操作過於複雜而消耗過多的資源。通過限制gas的消耗,TON確保每個網絡節點可以公平地分配計算資源,避免單個合約或操作過度使用網絡資源。

TON支持智能合約的平行處理,允許多個合約在不同的分片上同時運行而不會相互阻塞。在這個設計中,gas 模型與平行執行和分片機制密切集成。通過在多個分片上平行處理合約,TON 可以將 gas 計算和支付分佈到不同的節點和鏈上,避免網絡擁塞同時最大程度地利用資源。

TON的燃料模型包括一個動態調整機制,可根據網絡實時負載調整燃氣費用。這意味著在低網絡負載時期,用戶可以以較低的燃氣費用執行合約,鼓勵在離峰時段進行操作,平衡網絡資源使用。這個機制不僅提升了用戶體驗,還通過市場驅動的方法控制了峰值資源使用。

TON智能合約易被忽略的漏洞

我們先前的安全分析文章在TON上,我們詳細介紹了TON生態系統中的常見安全漏洞。如需進一步參考,請參見下表:


本文將重點介紹 TON 合約中常被忽視的漏洞,由我們的團隊總結如下:

(1) 代碼可讀性優化

在TON智能合約中,數字通常用於存儲與消息發送相關的數據。例如,在下面的代碼中,多個數字實例用於表示相應的標識符和數據存儲長度,這大大降低了代碼的可讀性和可維護性。其他開發人員在閱讀代碼時可能會發現理解這些數字的含義和用途具有挑戰性。為了提高可讀性和可維護性,建議將關鍵數值定義為命名常量。例如,定義0x18NON_BOUNCEABLE.

  1. check_std_addr(address);was msg = begin_cell() store_uint(0x18, 6) ;; nobounce store_slice(address) store_coins(amount) store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) end_cell();send_raw_message(msg, 1);

此外,在合約判斷條件的錯誤訊息中,還建議定義相應的變量來替換錯誤碼。

(2) 使用end_parse()确保数据完整性

在TON合約中,數據解析遵循固定的順序,從原始數據逐步加載指定類型的數據。該解析方法確保數據一致性和準確性,如下所示:

注意end_parse()用於檢查數據切片是否為空。如果切片不為空,該函數將拋出異常。這確保數據的格式和內容符合預期。如果end_parse()功能檢測切片中的剩餘數據,可能表明數據解析未按預期進行,或者數據格式存在問題。因此,通過調用end_parse()你可以验证在解析过程中是否有任何遗漏或异常。

(3) 由不匹配的數據存儲和類型引起的異常情況

這主要涉及匹配的整數uint存儲類型。例如,在下面的代碼中,store_int()function is used to store an 整数價值-42,但是load_uint()用於加載此值,可能會導致異常。

(4) 正確使用inline_refinline修飾語

首先,重要的是要区分inlineinline_ref修飾語:

內嵌: 具有的功能內嵌調用者在每次調用時將其代碼直接插入調用站點。這意味著函數的實際代碼被複製到調用位置,而不是通過函數跳轉執行,這減少了函數調用開銷,但可能導致代碼重複。

inline_ref:帶有的功能inline_ref修飾語將它們的代碼存儲在獨立的單元中。每次調用該功能時,TVM通過該單元中存儲的代碼執行。CALLREF命令,避免代碼重複並提高複雜功能或多次調用的效率。

總之,使用嵌入式為了簡化調用開銷,可以使用簡單的函數,但要注意可能的代碼重複。使用inline_ref為了更大或更頻繁地調用函數以提高效率並避免代碼重複。

(5) 確定正確的工作鏈

TON 允許創建最多 2^32 個工作鏈,每個工作鏈可以進一步細分為最多 2^60 個分片。最初有兩個工作鏈:主鏈 (-1) 和基礎鏈 (0)。在合約中計算目標地址時,必須指定正確的工作鏈 ID,以確保生成的錢包地址在正確的工作鏈上。為了避免生成錯誤的地址,建議使用。force_chain()要明確指定鏈ID。

(6) 避免錯誤碼衝突

有效管理錯誤代碼對於合同設計至關重要,以確保一致性並避免混淆。對於TON智慧合約,請確保每個錯誤代碼在合約中都是唯一的,以防止衝突和模棱兩可的錯誤消息。此外,避免與 TON 平臺或底層系統定義的標準錯誤代碼發生衝突。例如,錯誤代碼 333 指示鏈 ID 不匹配。建議使用 400 到 1000 之間的錯誤代碼來防止此類衝突。

(7) 儲存數據和調用return()操作完成後

在TON智能合約中,消息處理涉及根據操作碼選擇不同的邏輯。完成相應的邏輯後,需要兩個額外的步驟:首先,如果數據已被修改,則調用。save_data()要确保更改被存储;否则,更改将无效。其次,调用返回()指示操作已完成;否則,一個throw(0xffff)將觸發例外情況。

() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {

int flags = cs~load_uint(4);

if (flags & 1) {

;; 忽略所有退回的訊息

返回 ();

}

slice sender_address = cs~load_msg_addr();

load_data();

int op = in_msg_body~load_op();

if ((op == op::op_1())) {

handle_op1();

save_data();

返回 ();

}

if ((op == op::op_2())) {

handle_op2();

save_data();

return ();

}

if ((op == op::op_3())) {

handle_op3();

save_data();

返回 ();

}

throw(0xffff);

}

綜上所述,TON區塊鏈憑藉其創新的架構和靈活的開發環境,正在成為去中心化應用開發者的理想平臺。然而,隨著智慧合約在TON生態系統中發揮越來越重要的作用,安全問題不容忽視。開發者應深刻理解TON生態的特點,嚴格遵循最佳實踐,加強安全審計流程,確保合約的健壯性和安全性。只有這樣,才能充分發揮TON平台的優勢,構建更安全、更可靠的去中心化應用,保障整個生態的健康發展。

TON生態系統目前正在經歷快速增長,吸引了大量資金和活躍使用者。但是,隨之而來的安全問題不容忽視。為保證TON生態的安全性和可靠性,Beosin針對TON智慧合約調用和運營的特點,提供全面、專業的安全審計,支援生態的發展。

Beosin在TON生態系統中擁有眾多成功案例。此前,Beosin對領先的去中心化穩定幣專案Aqua協定和DeFi基礎設施ONTON Finance進行了徹底的安全審計。審計涵蓋多個方面,包括智慧合約代碼的安全性、業務邏輯實現的正確性、合約代碼的氣體優化以及潛在漏洞的檢測和修復。

聲明:

  1. 本文轉載自[Beosin],原標題為《貝新硬核研究|從風險到保護:TON智慧合約的安全風險與優化建議》,版權歸原作者所有[貝辛],如果您對轉載有任何異議,請聯繫Gate 學習團隊團隊將根據相關程序盡快處理。

  2. 免責聲明:本文所表達的觀點和意見僅代表作者個人觀點,並不構成任何投資建議。

  3. 該文章的其他語言版本由Gate Learn團隊翻譯,並未提及。Gate.io,譯文不得複製、分發或抄襲。

從風險到保護:TON智能合約的安全風險和優化建議

中級9/18/2024, 6:20:19 PM
探索TON區塊鏈平台的智能合約功能,包括其獨特的異步消息機制、賬戶模型和燃氣費模型。本文詳細分析了TON區塊鏈架構,包括主鏈、工作鏈和分片鏈的設計,以及它們如何共同工作以增強網絡吞吐量和可擴展性。它還強調了編寫智能合約時需要注意的安全問題,並提供了實用建議和最佳實踐,以幫助開發人員避免常見的安全漏洞。

在快速發展的區塊鏈技術領域中,TON(The Open Network)作為一個高效靈活的區塊鏈平台,越來越受到開發者的關注。TON獨特的架構和功能為去中心化應用的開發提供了強大的工具和豐富的可能性。

然而,隨著功能和複雜性的增加,智能合約的安全性變得更加重要。TON上的智能合約編程語言FunC以其靈活性和效率而聞名,但也存在許多潛在的風險和挑戰。撰寫安全可靠的智能合約需要開發人員對FunC的特性和潛在風險有深入了解。

本文將詳細分析TON區塊鏈上與智能合約相關的功能,以及通常被忽略的TON智能合約中的漏洞。

分析TON的異步功能和帳戶機制

智能合約中的非同步調用

網絡分片和異步通信

TON區塊鏈設計有三種類型的鏈:主鏈,工作鏈和分片鏈。

主鏈是整個網路的核心,負責存儲整個網路的元數據和共識機制。它記錄所有工作鏈和分片鏈的狀態,並確保網路一致性和安全性。工作鏈是獨立的區塊鏈,最多有2^32條鏈,負責處理特定類型的交易和智能合約。每個工作鏈都可以有自己的規則和功能,以滿足不同的應用需求。分片鏈是工作鏈的子鏈,用於進一步劃分工作鏈的工作量,增強處理能力和可擴充性。每個工作鏈最多可以拆分為2^60個分片鏈,分片鏈獨立處理一些交易,實現高效的並行處理。

理論上,每個帳戶可以獨占一個Shardchain,每個帳戶獨立維護其COIN/TOKEN餘額。帳戶之間的交易可以完全並行。帳戶通過異步消息進行通信,消息在Shardchains之間傳遞的路徑是log_16(N)-1,其中N是Shardchains的數量。


圖片來源:https://frontierlabzh.medium.com/ton-weixin-e1d3ae3b3574在 Ton 的 web3 世界中,交互是通過發送和接收消息進行的。這些消息可以是內部的(通常由智能合約相互作用發送)或外部的(由外部來源發送)。消息傳遞過程不需要目標合約的即時響應,允許發件人繼續執行其餘邏輯。這種異步消息傳遞機制與以太坊的同步呼叫相比,提供了更大的靈活性和可擴展性,減少了因等待響應而導致的性能瓶頸,同時也引入了處理並發和競態條件的挑戰。

消息格式和結構

在TON中,消息通常包括發送者、接收者、金額和消息正文等信息。消息主體可以包含函數調用、數據傳輸或其他自定義內容。TON的消息格式設計靈活且可擴展,可以有效地在不同合約之間傳遞各種類型的信息。

消息隊列和狀態處理

每個合約都維護一個消息隊列,用於存儲尚未處理的消息。在執行期間,合約從隊列中逐一處理消息。由於消息處理是異步的,合約的狀態在收到消息後不會立即更新。

異步消息傳遞的優勢

•高效的分片機制:TON的非同步機制與其分片設計高度兼容。每個分片獨立處理合約訊息和狀態變化,避免了跨分片同步引起的延遲。這種設計增強了整個網絡的吞吐量和可擴展性。

•減少資源消耗:異步消息不需要立即回應,允許TON合約在多個區塊中執行,避免在單個區塊內過度消耗資源。這使得TON能夠支持更複雜和資源密集型的智能合約。

•容錯和可靠性:異步消息傳遞機制提高了系統的容錯能力。例如,如果由於資源限制或其他原因,合約無法及時回應消息,發送者可以繼續處理其他邏輯,防止系統因單個合約延遲而停滯不前。

非同步合約設計的挑戰

•状态一致性问题:由于消息传递的异步性,合约可能在不同的时间接收到不同的消息,这需要开发人员特别注意状态的一致性。在设计合约时,关键是考虑不同的消息顺序可能会影响状态变化,并确保系统在所有情况下保持一致。

•競態條件和保護:非同步消息處理引入潛在的競態條件問題,多個消息可能同時嘗試修改合約狀態。開發人員需要實施適當的鎖定機制或使用事務操作來防止狀態衝突。

•安全注意事項:當處理跨合約通訊時,異步合約容易受到中間人攻擊或重放攻擊等風險的影響。因此,在設計異步合約時,必須考慮這些潛在的安全風險並採取預防措施,例如使用時間戳記、隨機數或多重簽名方法。

分類帳模型

TON(The Open Network)在設計其區塊鏈基礎設施時採用了獨特的賬戶抽象和分類帳模型。該模型的靈活性體現在它如何管理賬戶狀態、消息傳遞和合約執行。

帳戶抽象化

TON的賬戶模型使用基於合約的抽象,每個賬戶可以被視為一個合約。這與以太坊的賬戶抽象模型有些相似,但更靈活和通用。在TON中,賬戶不僅僅是資產的容器;它們還包括合約代碼和狀態數據。每個賬戶都包含其代碼、數據和消息處理邏輯。

帳戶結構: 每個TON帳戶都有一個唯一的地址,該地址是從帳戶代碼的哈希值、部署時的初始數據和其他參數的組合生成的。這意味著在不同的環境中(例如不同的區塊鏈或分片)部署相同的代碼和初始數據可能會產生不同的地址。

靈活性:由於每個帳戶都可以執行自己的合約代碼,因此TON帳戶可以實現非常複雜的邏輯。帳戶不僅僅是簡單的餘額持有者,還可以處理複雜的狀態轉換、帳戶間消息通信,甚至基於特定條件的自動化。這使得TON的帳戶模型與傳統的區塊鏈帳戶模型相比更具可擴展性和靈活性。

帳本結構

TON的帳本結構設計為有效處理大規模並行交易,支援異步消息傳遞和多分片操作。每個帳戶的狀態存儲在默克爾樹結構中,提供了有效的狀態驗證能力。

狀態存儲

帳戶狀態信息存儲在持久存儲中,並通過 Merkle 樹進行組織,以確保完整性和安全性。該設計還支持對狀態的高效查詢和驗證,特別是在跨 shard 交易中。

帳戶或智能合約的狀態通常包括以下內容:

  1. 基本貨幣餘額 2. 其他貨幣餘額 3. 智能合約代碼(或其哈希) 4. 智能合約的持久數據(或其 Merkle 哈希) 5. 持久存儲單元數量和原始字節使用情況的統計數據 6. 最近支付給智能合約持久存儲的時間戳(基本上是主鏈區塊編號) 7. 從此帳戶轉移貨幣和發送消息所需的公鑰(可選;默認情況下,此公鑰等於帳戶 ID)。在某些情況下,此處可能還可以找到更複雜的簽名檢查代碼,類似於比特幣交易輸出;在這種情況下,帳戶 ID 將是此代碼的哈希值。

並非每個帳戶都需要所有信息。例如,智能合約代碼只與智能合約有關,而不適用於“簡單”帳戶。此外,雖然每個帳戶必須具有基本貨幣(例如基本工作鏈和分片鏈的 Gram)的非零餘額,但其他貨幣餘額可能為零。為了避免保留未使用的數據,在創建工作鏈時定義了一種總乘積類型,使用不同的標記字節來區分各種“構造函數”。最終,帳戶狀態被保存為TVM持久存儲中的一組單元。

消息傳遞和處理

TON的帳本結構包括內置支持異步消息傳遞。每個帳戶可以獨立處理接收的消息並更新其狀態。這種異步消息傳遞機制允許帳戶之間進行復雜的交互,而不會因為任何單個操作的延遲而影響其他帳戶的正常運作。

氣體模型

TON(The Open Network)透過其獨特的燃氣費用模型顯著優化智能合約的執行效率。該燃氣費用模型用於測量和限制智能合約執行期間消耗的資源。與傳統的區塊鏈(如以太坊)相比,TON的模型更複雜、更高效,允許更精確地管理合約執行期間的資源消耗。

TON的gas模型可以準確地測量智能合約執行期間消耗的計算資源、存儲操作和消息傳遞成本。通過為計算、存儲和消息等資源提供詳細的測量,TON的gas模型可以防止操作過於複雜而消耗過多的資源。通過限制gas的消耗,TON確保每個網絡節點可以公平地分配計算資源,避免單個合約或操作過度使用網絡資源。

TON支持智能合約的平行處理,允許多個合約在不同的分片上同時運行而不會相互阻塞。在這個設計中,gas 模型與平行執行和分片機制密切集成。通過在多個分片上平行處理合約,TON 可以將 gas 計算和支付分佈到不同的節點和鏈上,避免網絡擁塞同時最大程度地利用資源。

TON的燃料模型包括一個動態調整機制,可根據網絡實時負載調整燃氣費用。這意味著在低網絡負載時期,用戶可以以較低的燃氣費用執行合約,鼓勵在離峰時段進行操作,平衡網絡資源使用。這個機制不僅提升了用戶體驗,還通過市場驅動的方法控制了峰值資源使用。

TON智能合約易被忽略的漏洞

我們先前的安全分析文章在TON上,我們詳細介紹了TON生態系統中的常見安全漏洞。如需進一步參考,請參見下表:


本文將重點介紹 TON 合約中常被忽視的漏洞,由我們的團隊總結如下:

(1) 代碼可讀性優化

在TON智能合約中,數字通常用於存儲與消息發送相關的數據。例如,在下面的代碼中,多個數字實例用於表示相應的標識符和數據存儲長度,這大大降低了代碼的可讀性和可維護性。其他開發人員在閱讀代碼時可能會發現理解這些數字的含義和用途具有挑戰性。為了提高可讀性和可維護性,建議將關鍵數值定義為命名常量。例如,定義0x18NON_BOUNCEABLE.

  1. check_std_addr(address);was msg = begin_cell() store_uint(0x18, 6) ;; nobounce store_slice(address) store_coins(amount) store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) end_cell();send_raw_message(msg, 1);

此外,在合約判斷條件的錯誤訊息中,還建議定義相應的變量來替換錯誤碼。

(2) 使用end_parse()确保数据完整性

在TON合約中,數據解析遵循固定的順序,從原始數據逐步加載指定類型的數據。該解析方法確保數據一致性和準確性,如下所示:

注意end_parse()用於檢查數據切片是否為空。如果切片不為空,該函數將拋出異常。這確保數據的格式和內容符合預期。如果end_parse()功能檢測切片中的剩餘數據,可能表明數據解析未按預期進行,或者數據格式存在問題。因此,通過調用end_parse()你可以验证在解析过程中是否有任何遗漏或异常。

(3) 由不匹配的數據存儲和類型引起的異常情況

這主要涉及匹配的整數uint存儲類型。例如,在下面的代碼中,store_int()function is used to store an 整数價值-42,但是load_uint()用於加載此值,可能會導致異常。

(4) 正確使用inline_refinline修飾語

首先,重要的是要区分inlineinline_ref修飾語:

內嵌: 具有的功能內嵌調用者在每次調用時將其代碼直接插入調用站點。這意味著函數的實際代碼被複製到調用位置,而不是通過函數跳轉執行,這減少了函數調用開銷,但可能導致代碼重複。

inline_ref:帶有的功能inline_ref修飾語將它們的代碼存儲在獨立的單元中。每次調用該功能時,TVM通過該單元中存儲的代碼執行。CALLREF命令,避免代碼重複並提高複雜功能或多次調用的效率。

總之,使用嵌入式為了簡化調用開銷,可以使用簡單的函數,但要注意可能的代碼重複。使用inline_ref為了更大或更頻繁地調用函數以提高效率並避免代碼重複。

(5) 確定正確的工作鏈

TON 允許創建最多 2^32 個工作鏈,每個工作鏈可以進一步細分為最多 2^60 個分片。最初有兩個工作鏈:主鏈 (-1) 和基礎鏈 (0)。在合約中計算目標地址時,必須指定正確的工作鏈 ID,以確保生成的錢包地址在正確的工作鏈上。為了避免生成錯誤的地址,建議使用。force_chain()要明確指定鏈ID。

(6) 避免錯誤碼衝突

有效管理錯誤代碼對於合同設計至關重要,以確保一致性並避免混淆。對於TON智慧合約,請確保每個錯誤代碼在合約中都是唯一的,以防止衝突和模棱兩可的錯誤消息。此外,避免與 TON 平臺或底層系統定義的標準錯誤代碼發生衝突。例如,錯誤代碼 333 指示鏈 ID 不匹配。建議使用 400 到 1000 之間的錯誤代碼來防止此類衝突。

(7) 儲存數據和調用return()操作完成後

在TON智能合約中,消息處理涉及根據操作碼選擇不同的邏輯。完成相應的邏輯後,需要兩個額外的步驟:首先,如果數據已被修改,則調用。save_data()要确保更改被存储;否则,更改将无效。其次,调用返回()指示操作已完成;否則,一個throw(0xffff)將觸發例外情況。

() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {

int flags = cs~load_uint(4);

if (flags & 1) {

;; 忽略所有退回的訊息

返回 ();

}

slice sender_address = cs~load_msg_addr();

load_data();

int op = in_msg_body~load_op();

if ((op == op::op_1())) {

handle_op1();

save_data();

返回 ();

}

if ((op == op::op_2())) {

handle_op2();

save_data();

return ();

}

if ((op == op::op_3())) {

handle_op3();

save_data();

返回 ();

}

throw(0xffff);

}

綜上所述,TON區塊鏈憑藉其創新的架構和靈活的開發環境,正在成為去中心化應用開發者的理想平臺。然而,隨著智慧合約在TON生態系統中發揮越來越重要的作用,安全問題不容忽視。開發者應深刻理解TON生態的特點,嚴格遵循最佳實踐,加強安全審計流程,確保合約的健壯性和安全性。只有這樣,才能充分發揮TON平台的優勢,構建更安全、更可靠的去中心化應用,保障整個生態的健康發展。

TON生態系統目前正在經歷快速增長,吸引了大量資金和活躍使用者。但是,隨之而來的安全問題不容忽視。為保證TON生態的安全性和可靠性,Beosin針對TON智慧合約調用和運營的特點,提供全面、專業的安全審計,支援生態的發展。

Beosin在TON生態系統中擁有眾多成功案例。此前,Beosin對領先的去中心化穩定幣專案Aqua協定和DeFi基礎設施ONTON Finance進行了徹底的安全審計。審計涵蓋多個方面,包括智慧合約代碼的安全性、業務邏輯實現的正確性、合約代碼的氣體優化以及潛在漏洞的檢測和修復。

聲明:

  1. 本文轉載自[Beosin],原標題為《貝新硬核研究|從風險到保護:TON智慧合約的安全風險與優化建議》,版權歸原作者所有[貝辛],如果您對轉載有任何異議,請聯繫Gate 學習團隊團隊將根據相關程序盡快處理。

  2. 免責聲明:本文所表達的觀點和意見僅代表作者個人觀點,並不構成任何投資建議。

  3. 該文章的其他語言版本由Gate Learn團隊翻譯,並未提及。Gate.io,譯文不得複製、分發或抄襲。

即刻開始交易
註冊並交易即可獲得
$100
和價值
$5500
理財體驗金獎勵!