728x90
반응형
저번 피드에서 스마트 계약으로 이더를 보내는 방법을 알아보았습니다.
2023.01.04 - [Blockchain/Solidity] - Send Ether to the Smart Contract (1) 및 payable 개념 - 공부하는 도비
오늘은 block.timestamp를 이용해서 이더를 입금하고, 바로 인출하지 못하도록 인출 잠금 시간을 설정해 보겠습니다.
* block.timestamp *
유닉스 시간으로 현재 블록의 시간을 의미합니다. (current block timestamp as seconds since unix epoch)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract temp {
function viewBlockTime() public view returns (uint) {
return block.timestamp;
}
}
* send/withdraw ether to the smart contract *
현재의 예시는 시간에 상관없이 언제든 스마트 계약에 있는 이더를 출금할 수 있습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract SendMoneyEx {
uint public balanceReceived;
function receiveMoney() public payable {
balanceReceived += msg.value; // msg.value : number of wei sent with the message
}
function getBalance() public view returns (uint) {
return address(this).balance; // address(this) converts the Smart Contract instance to an address.
}
function withdrawMoney() public{
address payable to = payable(msg.sender);
to.transfer(getBalance());
balanceReceived = 0;
}
function withdrawMoneyTo(address payable _to, uint256 amount) public {
require(address(this).balance >= amount, "ERROR");
_to.transfer(amount);
balanceReceived -= amount;
}
}
위 코드에 block.timestamp를 추가하여 입금 1분 후, 1시간 후 등등 후에 출금이 가능하도록 코드를 수정해보겠습니다.
* withdrawal locking with block.timestamp *
1. receiveMoney() 함수가 실행되면, lockedTime 변수에 현재 블록의 시간 + 1분이라는 값이 저장
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract SendMoneyEx {
uint public balanceReceived;
uint public lockedTime;
function receiveMoney() public payable {
balanceReceived += msg.value;
lockedTime = block.timestamp + 1 minutes;
}
}
2. lockedTime이 block.timestamp보다 작으면 오류 발생
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract SendMoneyEx {
uint public balanceReceived;
uint public lockedTime;
function receiveMoney() public payable {
balanceReceived += msg.value; // msg.value : number of wei sent with the message
lockedTime = block.timestamp + 1 minutes;
}
function getBalance() public view returns (uint) {
return address(this).balance; // address(this) converts the Smart Contract instance to an address.
// So, this line essentially returns the amount of Ether that are stored on the Smart Contract itself.
}
function withdrawMoney() public{
// block.timestamp : current block timestamp as seconds since unix epoch
require(lockedTime < block.timestamp, "ERROR");
address payable to = payable(msg.sender);
to.transfer(getBalance());
balanceReceived = 0;
}
function withdrawMoneyTo(address payable _to, uint256 amount) public {
require(address(this).balance >= amount && lockedTime < block.timestamp, "ERROR");
_to.transfer(amount);
balanceReceived -= amount;
}
}
require 조건에 충족하지 않고, withdraw함수를 실행시켰을 때 결과
require 조건에 충족했을 땐, withdrawMoney()함수가 정상적으로 실행이 됩니다.
* Time Units *
* require *
2023.01.02 - [Blockchain/Solidity] - require() 사용 - 공부하는 도비
'Blockchain > Solidity' 카테고리의 다른 글
Solidity 생성자(constructor) - 공부하는 도비 (1) | 2023.02.01 |
---|---|
Send Ether to the Smart Contract (1) 및 payable 개념 - 공부하는 도비 (0) | 2023.01.04 |
delete element of array and mapping - 공부하는 도비 (0) | 2023.01.02 |
require() 사용 - 공부하는 도비 (0) | 2023.01.02 |
msg.sender 사용 - 공부하는 도비 (0) | 2023.01.02 |