Solidity

我們可以將一些驗證值從 Web 傳遞到 Solidity 合約嗎?

  • February 3, 2019

有沒有一種方法可以將一些價值檢查從 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 模式的多步驟過程,並且仍然將伺服器置於集中過程的中心。所以,更複雜的好處有問題。

希望能幫助到你。

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