2016-04-15 79 views
0

我正在使用testrpc和web3。以太坊合同功能是否安全?

我用下面的成語,以確保只有先前定義的用戶應該能夠做一些事情:

function doSomethingProtected() { 
     if (msg.sender != authorizedUser) 
       throw; 

     flagSomething = true; 
    } 

當調用與WEB3實例化合同的功能如下:

myContract.doSomethingProtected({ from: "0x..." }); 
它的工作原理是

。起初我很高興,但後來我意識到web3 API並不要求我爲私鑰或諸如此類提供任何密碼。

任何人都可以通過對某人公共密鑰/地址的簡單認識來調用這個函數嗎?

在這些例子中使用這個成語使我相信以太坊合同的好處是它確保了msg.sender的加密保證。

回答

2

原因是您正在使用testRPC,它不鎖定它的帳戶,所以您不需要密碼。

如果您是用geth來做這件事,那麼您需要在發送之前解鎖帳戶。

如果沒有私鑰,該函數將拋出一個錯誤,所以您在使用該授權方法時是正確的。

2

在沒有看到更多代碼的情況下很難確定,但似乎您可能正在本地節點上調用合約,而不是發送事務。交易只能由擁有該賬戶私鑰的人員簽名,這意味着您可以依靠msg.sender準確無誤,但在本地節點上執行的消息不會執行該操作。但是,他們所做的任何更改都將回滾並且不會應用於狀態,因此,無論您的本地呼叫執行什麼操作都無關緊要。

+0

我正在對testrpc節點運行它。也許這就是問題所在。 – Interition

0

我的猜測是您的帳戶在調用該函數時已解鎖。我不記得您的帳戶在web3中解鎖後的確切時間。但我可能是錯的。本來會添加這個作爲評論,但我現在不允許。

1

通常,有兩種方法可以從web3.js中調用函數:使用事務或僅使用「調用」。只有在交易中,您才能真正修改區塊鏈內容(始終可以閱讀)。事務總是需要有效的簽名,因此需要訪問私鑰。

您未被要求輸入密碼的原因可能是您已經解鎖了該帳戶。此外,授權用戶以外的用戶可以調用該功能,只有這些更改將被丟棄。