Solidity constructor1
contract CONSTRUCTOR{ uint a; uint b; constructor() { b=4; } function setA() public { a = 5; } function getA() public view returns (uint) { return a; } function getB() public view returns(uint) { return b; } }
CONSTRUCTOR는 초기에 설정해야하거나 중요한 변수를 사용할 때 constructor 사용한다
setA와 같이 선언해주지 않아도 b값은 4로 이미 설정되어있다.
Solidity constructor 응용
contract CONSTRUCTOR2{ uint a; constructor(uint _a) { a=_a; } function getA() public view returns (uint){ return a; } } contract CONSTRUCTOR3{ struct Student { string name; uint number; } Student s; //초기에 설정해야하거나 중요한 변수를 사용할 때 constructor 사용 constructor(string memory _name, uint _number) { s = Student(_name, _number); } function getStudent() public view returns (Student memory){ return s; } } contract CONSTRUCTOR4 { uint a; constructor(uint _a) { if(_a>5) { a = _a; } else { a = _a*2; } } function getA() public view returns(uint) { return a; } }
- Constructor2 는
이 부분에 인풋값을 넣어주면서 배포(설정)할 수 있다.- Constructor3 는 구조체에 인풋값을 넣어서도 설정해줄 수 있다는 함수이다.
- Constructor4 는 인풋값의 조건에 따라서 설정해줄 수 있다는 함수이다.
Solidity constructor 응용
contract CONSTRUCTOR5 { /* 1. 1번 지갑으로 배포, value는 10eth로 2. 배포 후 지갑 잔고 확인 3. 2번 지갑으로 deposit() 1eht // 3,4,5번 지갑으로 똑같이 실행 4. 지갑 잔고 확인 후, 2번 지갑으로 transferTo시도 5. 1번 지갑으로 transferTo 시도, _to의 지갑주소는 6번 지갑 금액은 5eth 6. 2번 지갑으로 withdraw 함수 시도, 1번 지갑으로 withdraw 함수 시도 0x17F6AD8Ef982297579C203069C1DbfFE4348c372 */ address payable owner; constructor() payable { payable (this).transfer(msg.value); // 배포할 때 msg.value만큼 contract에게 바로 입금 owner = payable(msg.sender); // 배포하는 지갑주소가 바로 owner로 설정 } function getOwner() public view returns (address){ return owner; } // 특정 지갑주소에 특정 금액만큼 보내는 함수 function tranferTo(address payable _address, uint _amount) public { require(msg.sender == owner, "only owner can transfer asset"); _address.transfer(_amount); } receive() external payable {} // 일반 거래(별도의 호출되는 함수 없을 때) 시 해당 contract가 돈을 받을 수 있게 해주는 함수 // 돈을 받는 함수 function deposit() payable public returns(uint) { return msg.value; } // contract가 owner에게 전액 돈을 보내는 함수, owner 입장에서는 전액 인출 function withdraw() public { require(msg.sender == owner, "only owner can transfer asset"); owner.transfer(address(this).balance); } // contract가 owner 에게 _amout만큼 보내는 함수 function withdraw2(uint _amount) public{ require(msg.sender == owner, "only owner can transfer withdraw asset"); owner.transfer(_amount /* _amout*10**18 */); } function withdraw3() public{ require(msg.sender == owner, "only owner can transfer withdraw asset"); owner.transfer(1 ether); } }