Contract-Development

如何檢索發送到合約的 ETH?

  • May 23, 2021

讓我們看看這個簡單的合約:

contract MyContract {

   receive() external payable {
       require( msg.value > 0 );
       // Thank you but how can I take this ETH later if I need (not now)?
   }

}

假設我需要儲存所有收到的 ETH,然後決定將其交給某人。如何命令乙太坊合約將我的 ETH “轉移”給某人?

正如所寫,它不能完成。

對於有經驗的開發人員來說,重要的範式轉變之一是意識到合約不能也不會做它沒有被程式做的事情。沒有管理員訪問權限,沒有對數據庫(或“狀態”)的直接訪問權限,也沒有辦法修復任何東西,除非它主動插入到原始契約中。

範例中缺少的是提款功能的一些實現。當你考慮它應該做什麼時,想想誰應該能夠做到,他們應該能夠退出多少。如果沒有這樣的指示,契約將根本沒有程序。這與以 root 身份登錄、更改程式碼以及對執行在自有伺服器上的數據庫進行特權訪問完全不同。

考慮:

function withdraw() public {
 msg.sender.send(address(this).balance));
}

可能,“任何人都可以索取並接受這一切”並不令人滿意。假設它是部署者的特權:

address owner;

constructor() {
 owner = msg.sender;
}

function withdraw() public {
 require(msg.sender == owner, "not the owner");
 msg.sender.send(address(this).balance));
}

也許應該允許部分提款:

function withdraw(unit amount) public {
 require(msg.sender == owner, "not the owner");
 msg.sender.send(amount);
}

編譯器版本之間的語法會有所不同,這些只是草圖,所以請原諒您發現的任何小問題。我的觀點是,這是一種思維方式。您必須預測將需要什麼並編纂契約規則,否則,可能性就不存在了。

“預設設置”是沒有人擁有任何特權——甚至作者/部署者/所有者也沒有。契約中始終明確規定了特定的特權。

希望能幫助到你。

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