Contract-Development
使功能對普通使用者不可見
我有一份相當大的契約,其中包含一些功能,其中一些是為管理目標而設計的。這是一個簡化的範例:
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 的程式碼來完成,但我不確定。所以,在這個例子中,我需要刪除 for
admin_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; _; }
關於逆向工程,這裡有一個關於合約是什麼的概念範例,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)。他們可能不知道哪個是管理函式,但他們當然可以嘗試呼叫每個函式並將不同的參數傳遞給它,看看會發生什麼。