Go-Ethereum
是否可以定義以下接受兩方資金的智能合約?
我想部署一個從兩方接收資金的智能合約。合約是用來自個人(稱為透露者)和另一個接收者(命名為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); } }
這份契約是從這個很好的答案中編輯的:使用乙太坊區塊鏈的定時承諾
在 function
providePreimage()
中,您嘗試將 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
。