컨트랙트 구현 연습
contract Faucet {
address owner;
constructor() payable {
owner = msg.sender;
}
function chkBalance() public view returns(uint) {
return address(this).balance;
}
function sendEth() public {
require(address(this).balance > 0.5 ether);
payable(msg.sender).transfer(0.1 ether);
}
function clear() public {
require(owner == msg.sender);
selfdestruct(payable(owner));
}
function donate() payable public {
}
}
메타마스크에 있는 faucet과 같은 기능을 하는 컨트랙트이다. 최초 생성시 constructor를 통해 생성자의 원주소가 owner로 지정이된다. 생성시 value에 담은 이더만큼 컨트랙트에 담기게 되는데 다른 사용자가 sendEth를 사용할때마다 0.1이더씩 받게 된다. 설정한 require로 인해 0.5이더 보다 많이 남아있을 시에만 송금이 되게 하고, 유사시 남아있는 이더를 회수하기 위해서 clear함수에 selfdestruct 속성을 사용해서 owner인 배포자만이 본인의 지갑으로 잔여 이더가 전송되도록 설정하였다. donate함수를 통해 배포자가 최초 배포시 설정한 이더보다 더 추가해서, 아무에게나부터 받을 수 있도록 설정하였다.
.cf) donate를 파라미터로 지정하거나 단위별로 쪼개서 받기는 힘들다. metamask의 donate버튼처럼 프론트의 영역에서 지정해서 만들어놓거나 하는 방법이 있다. 그러나 얼마만 받도록 contract로 들어오는 양을 contract에서 지정해놓거나 하는 방법은 없다. payable로 송금이 가능한 설정만 지정할 수있고, 추후에 web과의 연동과정에서 web3함수에 value를 미리 지정해 놓는다면 특정 버튼을 눌렀을때, 미리 지정한 value만큼 전송하는 기능을 생성할 수 있는 정도이다.
.cf2) 솔리디티 언어에서는 문자열 비교 (예를들면 name1 == name2)가 불가하다. 비교하기 위해서는keccak256으로 해시값으로 변환후에 그 변환값을 비교하여야 한다.
이러한 방식 ⇒ (keccak256(name1) == keccak256(name2))
view, pure 속성
컨트랙트 안에 존재하는 함수들 중 view나 pure의 속성들은 체인상의 데이터에 변화를 주지않는다. view의 경우 체인에 등록된 데이터를 읽어오기만 할 뿐이고, pure는 등록된 데이터를 읽지도, 사용하지도 않고 사용자가 입력한 input 값과 같은 체인 밖의 요소들만 사용한다. 체인 상의 변화가 생기도록할 때 서명이 요구되고, 그 과정 속에서 가스비를 내는 것이기 때문에, view나 pure속성을 사용하는 함수의 경우 서명이 필요없고 따라서 가스비 또한 낼 이유가 없다.
크립토 좀비