Solidity

有沒有為乙太坊智能合約設計的混淆工具或機制的例子

  • November 1, 2022

我正在嘗試為乙太坊智能合約創建一個混淆器,它可以混淆可靠性程式碼或字節碼。是否有任何特定的參考資料可以幫助我。

此外,是否有任何加密技術可以幫助保護敏感資訊,以防止像 etherscan 這樣的反編譯器不顯示有人反編譯程序的程序流或函式名稱。

我們必須記住,我們正在開發“公共和開放”的區塊鏈,這意味著所有數據都可以通過某種方式訪問。因此,我們不能限制對智能合約狀態變數的讀取訪問,就像我們不能隱藏錢包的餘額一樣。

  • 有了Web3js庫我們可以呼叫方法“getStorageAt(addressContratct, index)”來減去變數的值,也許這就是你要找的。

但是沒有安全機制Solidity允許我們混淆或絕對阻止讀取“*智能合約”的任何數據(*狀態變數)。

它用於創建一個介面,以確定與智能合約互動的最“最佳”和最安全的方式,無論是通過外部財產賬戶還是其他合約。它適用於狀態變數函式。但請記住,“節點”開源可操作的,就像它們的區塊鏈副本一樣

可以通過可見性條件和事務的全域變數來控制/阻止設置器(寫入)類型的函式,例如:

require(msg.sender == owner);

由於善意的“節點”不會保存合約狀態的變化,因此不會保存在新開采的區塊及其版本的區塊鏈中。在這些“節點”的EVM乙太坊虛擬機)中,合約將嚴格遵守可見性過濾器或要求開發人員為每種方法實施。

如果您是惡意節點,您可以操縱您的區塊鏈版本,但共識算法會在探勘新區塊時將您排除在外。***除非你擁有至少 51%***的網路,否則你實際上將成為沒人會考慮的區塊鏈分支。

可見性類型

  • Public: 完全可訪問,無論來源如何。
  • External:可從外部財產帳戶和通過消息(來自另一個契約的呼叫)訪問。它不能從同一合約的函式或從它派生的函式訪問。
  • Internal:只能通過同一合約中包含的另一個函式或從它派生的合約的函式訪問。它不能從外部合約消息或外部交易中訪問。
  • Private:只能通過包含在同一合約中的函式訪問,在“公共”和“外部”之間,在許多情況下,如果業務邏輯允許,最好使用“外部”。由於此可見性修改器消耗更少的氣體。

預設可見性

契約狀態變數(一般範圍是“內部”)和函式是(公共的)。

**注意:**如果我們聲明一個狀態變數為“public”,當我們編譯智能合約時,會自動生成一個與變數同名的getter類型方法。無需在原始碼中聲明。

因此,有兩種方法:數據的混淆和加密。

混淆

首先,你可以跳過驗證你的合約,然後沒有人可以得到原始碼。在這種情況下,您只能從 Etherscan 獲取字節碼。

因此,Etherscan 不是反編譯器。如果有人在那裡上傳原始碼,它只會顯示原始碼。

理論上,有人可以對字節碼進行逆向工程,但這已經導致程式碼非常模糊。沒有工具可以從字節碼創建“非混淆”原始碼。

如果出於某種奇怪的原因,您仍然想混淆原始碼本身,您基本上可以用虛擬名稱替換變數和函式(標準要求的除外)。我不知道有任何工具可以為 Solidity 做到這一點。

加密

您只能加密區塊鏈未使用的數據。因此,例如人的名字。發送到合約前加密,讀取合約時解密(鏈下)。

乙太坊真的不適合私人數據,因為一切都是公開的。

引用自:https://ethereum.stackexchange.com/questions/138539