Go-Ethereum

是否可以定義以下接受兩方資金的智能合約?

  • February 21, 2019

我想部署一個從兩方接收資金的智能合約。合約是用來自個人(稱為透露者)和另一個接收者(命名為fineRecipient )的一些**乙太幣初始化的,該接收者也應該存入一定數量的乙太幣。如果透露者呼叫具有某個雜湊值的正確原像的合約,他會取回他的資金以及接收者的存款。否則,接收方可以獲得合約中的所有資金。從安全的角度來看,以下契約是否可行?或者在實際生產環境中測試之前是否需要進行任何修改?

pragma solidity 0.5.2;

contract TimedCommitment {
   address payable revealer;
   address payable fineRecipient;
   bytes32 public hash;
   uint256 public deadline;

   constructor(address payable _fineRecipient, bytes32 _hash, uint256 timeout) public payable {
       revealer = msg.sender;
       fineRecipient = _fineRecipient;
       hash = _hash;
       deadline = now + timeout;
   }

 function  deposit(uint256 amount) payable public{
        require(msg.value == amount);
        require(msg.value == fineRecipient);

   }

   // If this is called with the correct preimage, the revealer gets their funds back.
   function providePreimage(bytes calldata preimage) external {
       require(keccak256(preimage) == hash);
       revealer.transfer(address(this).balance);
      revealer.transfer(address(this).amount);
   }

   // Pay the fine to the fineRecipient if the timeout has expired.
   function refund() external {
       require(msg.sender == fineRecipient);
       require(now >= deadline);

       msg.sender.transfer(address(this).balance);
   }
}

這份契約是從這個很好的答案中編輯的:使用乙太坊區塊鏈的定時承諾

在 functionprovidePreimage()中,您嘗試將 ether 轉移兩次。這將導致還原。結果,揭示者將永遠無法提供原像並將乙太轉移回自身。最終將達到超時,並且fineRecipient能夠使用 將資金轉移給自己refund()

要解決此問題,請將 providePreimage() 函式更改為

function providePreimage(bytes calldata preimage) external {
   require(keccak256(preimage) == hash);
   revealer.transfer(address(this).balance);
}

作為額外的安全措施,您可以添加一個條件,即fineRecipient必須在達到超時之前至少 X 次存入其份額,以便revealer有足夠的時間來顯示原像。如果fineRecipient不這樣做,該refund()功能應退款revealer而不是fineRecipient

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