05-15 (2)

조하빈 ·2023년 5월 15일
0

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);
    }
}
profile
PPisland

0개의 댓글