Contract-Development

使功能對普通使用者不可見

  • December 4, 2016

我有一份相當大的契約,其中包含一些功能,其中一些是為管理目標而設計的。這是一個簡化的範例:

contract big_contract {
   function user_function_1 (uint32 arg1, string arg2) returns (uint32) {
       // ...
   }

   function user_function_2 (string arg1) returns (string){
       // ...
   }

   function admin_function (bool arg1) {
       // ...
   }
}

問題是 -我怎樣才能保留admin_function契約的程式碼,但讓它對一般使用者不可見?我知道,通常,您只需要添加幾行程式碼,例如if (msg.sender == owner) {...},但我想完全隱藏此功能。

據我了解,可以通過編輯 ABI 的程式碼來完成,但我不確定。所以,在這個例子中,我需要刪除 foradmin_function的定義,契約仍然可以工作,只是沒有能力呼叫admin_function. 但是對於那些擁有完整 ABI 的人來說,admin_function仍然可以使用。

[
  // {
  //   "constant":false,
  //   "inputs":[
  //      {
  //         "name":"arg1",
  //         "type":"bool"
  //      }
  //   ],
  //   "name":"admin_function",
  //   "outputs":[
  //
  //   ],
  //   "payable":false,
  //   "type":"function"
  // },
  {
     "constant":false,
     "inputs":[
        {
           "name":"arg1",
           "type":"uint32"
        },
        {
           "name":"arg2",
           "type":"string"
        }
     ],
     "name":"user_function_1",
     "outputs":[
        {
           "name":"",
           "type":"uint32"
        }
     ],
     "payable":false,
     "type":"function"
  },
  {
     "constant":false,
     "inputs":[
        {
           "name":"arg1",
           "type":"string"
        }
     ],
     "name":"user_function_2",
     "outputs":[
        {
           "name":"",
           "type":"string"
        }
     ],
     "payable":false,
     "type":"function"
  }

]

我是對的還是有其他方法可以使它起作用?

您的理解是正確的:您可以分發 ABI 的一個子集並以“默默無聞的安全性”的形式進行操作。但是任何擁有完整 ABI 或檢查(如逆向工程)合約程式碼的人仍然可以呼叫所有函式。區塊鏈上的所有合約(字節)程式碼都是公開的,推薦的方法是將修飾符附加到此類管理功能,例如:

modifier onlyOwner {
   if (msg.sender != owner) throw;
   _;
}

相關:Solidity 函式 - 私有可見性


關於逆向工程,這裡有一個關於合約是什麼的概念範例,ABI 是如何儲存在字節碼中的?

method_id = first 4 bytes of msg.data
if method_id == 0x25d8dcf2 jump to 0x11
if method_id == 0xaabbccdd jump to 0x22
if method_id == 0xffaaccee jump to 0x33
other code
0x11:
code for function with method id 0x25d8dcf2
0x22:
code for another function
0x33:
code for another function

有人檢查程式碼可以看到有3個函式(方法id:0x25d8dcf2、0xaabbccdd、0xffaaccee)。他們可能不知道哪個是管理函式,但他們當然可以嘗試呼叫每個函式並將不同的參數傳遞給它,看看會發生什麼。

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