Solidity
我們可以將一些驗證值從 Web 傳遞到 Solidity 合約嗎?
有沒有一種方法可以將一些價值檢查從 web 傳遞到solidity 合約例如,如果我們想確保呼叫合約函式的人出現在我們的網站上,而不是起訴其他呼叫源,如機器人或編譯器
我的函式是一個支付函式,在呼叫 receive() 函式時,乙太幣會轉移給使用者。
如果有任何此類解決方案可以進行檢查並將其傳遞給契約,這是有條件的要求或其他檢查以確保使用者出現在網站上。
有兩種模式可以開始。
重要的是要考慮誰/什麼將交易發送到合約。
**以伺服器為中心的選項:**如果是伺服器,那麼合約會檢查發件人是否是受信任的伺服器地址,然後基於伺服器是可信任的並且不會告訴它向非使用者發送資金。這意味著整個系統是非常集中的,並且依賴於伺服器的邏輯工作。
考慮:
modifier onlyServer { require(msg.sender == serverAddress); _; } function receive(address payable receiver, uint amount) public onlyServer { receiver.transfer(amount); emit ... }
**白名單選項:**如果是使用者(他們的瀏覽器),則合約將檢查允許使用該功能的地址的批准白名單。伺服器仍將在契約中扮演“角色”。它將從白名單中添加和刪除使用者。這將不那麼集中,但不會完全分散,因為中央權威仍然很重要。
考慮:
mapping(address => bool) public userAuthorized; modifier onlyUser { require(isUser(msg.sender)); _; } function isUser(address candidate) public view returns(bool isIndeed) { return userAuthorized[candidate]; } function receive() public view onlyUser { msg.sender.transfer(amount); emit ... } function addRemoveUser(address user, bool isAuthorized) public onlyServer { userAuthorized[user] = isAuthorized; emit ... }
即使這似乎是解決此問題的直覺方法,也很難實現組合。如果使用者啟動交易,然後合約要與伺服器核對,首先,在發送資金之前,這是一個涉及使用 Oracle 模式的多步驟過程,並且仍然將伺服器置於集中過程的中心。所以,更複雜的好處有問題。
希望能幫助到你。