Contract-Invocation

事件總是可以由使用者帳戶直接呼叫嗎?有沒有辦法讓它們內部化?

  • December 1, 2020

我正在使用事件來觸發訂單,基本上將它們用作通過區塊鏈與物聯網設備進行主/從連接的工具。

理想情況下,我希望始終驗證正確的 msg.sender 正在發送此訂單並發出事件,因此我使用此訪問控制創建了一個功能。但是我注意到我可以使用適當的參數直接呼叫事件來發出它(我在 truffle 上對此進行了測試),因此惡意使用者可以完全繞過具有訪問控制的功能。

在聲明事件時似乎不可能使用內部或私有可見性,因為它們不是函式。

所以我的問題是,有沒有辦法對事件實施訪問控製或可見性?是否有任何計劃來解決這個問題,或者我只是以錯誤的方式使用它們?

當您談論“呼叫”事件時,您是在談論發出(創建)它們還是在查詢它們?

一個事件被寫入所有參與節點可見的區塊鏈,所以你不能阻止人們查詢它們。

它們是由合約程式碼發出的,因此完全有可能讓您的合約檢查msg.sender或任何其他條件,並且只在適當的時候發出它們。如果您有一些應該這樣做但似乎不適合您的程式碼,請嘗試發布您的程式碼,如果可能的話,測試失敗。

當然,其他人可以使用相同名稱的事件創建與您不同的契約並發出他們喜歡的任何內容,但我懷疑這是這裡的問題,因為您通常不會監聽來自不相關契約的事件。

我將事件過濾器(從呼叫事件返回,就像它是一個函式一樣)與交易收據(從正常函式返回)混淆了。該事件不是通過直接呼叫而發出的,事件顯然只能從合約程式碼中發出。我提出的訪問控制問題不存在。

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