solidity Initialize

유지민·2022년 12월 5일
0

solidity

목록 보기
1/4

Initialize

코딩시 struct같은 구조체 안에 디폴트값을 줘야할 경우가 있다.
배열이나 주소값 등등 디폴트 값 주기.

contract Initialize {
    struct A {
        uint a;			// 0
        address b;		// address(0)
        address[] c;	// new address[](0)
        uint[] d;		// new uint[](0)
        string [] e; 	// new string[](0)
        bytes f;		// new bytes(0) -> new bytes(0)가 되는 이유 : array랑 똑같이 취급해주면 된다.
        bytes f2;		// ""
        bytes3 g;		// ""
        string h;		// ""
    }	
    
    A[] As;	// A형 배열 As 선언
    
	function setA() public {
        As.push(A(0, address(0), new address[](0), new uint[](0), new string[](0), new bytes(0), "", "",""   ));
    }    
}

struct안에 mapping이 있는 경우는 피하는게 상책
상대적으로 가벼운 struct안에 상대적으로 무거운mapping이 있는 경우 이중적인 경우라 함부로 default값을 주려는 경우 에러가 날수 있다.
또는 비효율적으로 해결해야한다.

    struct aa {
        uint a;
        mapping(uint => string) b; //struct는 가벼운데 mapping은 무거워서 이중적인 모습이라 에러가 여기저기서..
    }
    
    aa[] aas;
    
    function setaa() public {
        aa storage ABC;
        // aas[0] = ABC;
        //b ABC = aas[0];
        aas.push();
        // ABC.a = _a;
        aas[0].a = 100;
        aas[0].b[0] = "a";
    }
    
uint index;
    /*function setaa2(uint _b_uint, string memory _b_string) public {
        aas.push();
        aas[index++].a = _b_uint; // 오류 야기
        aas[index].b[_b_uint] = _b_string;
    }*/

    function setaa3(uint _b_uint, string memory _b_string) public {
        aas.push();
        aas[index].a = _b_uint;
        aas[index].b[_b_uint] = _b_string;
    }

    function setaa4(uint _b_uint, string memory _b_string) public {
        aas.push();
        aas[index].a = _b_uint;
        aas[index++].b[_b_uint] = _b_string;
    }

    function getaalength() public view returns(uint) {
        return aas.length;
    }

    function getaa(uint _a, uint _b) public view returns(uint, string memory) {
        return (aas[_a].a, aas[_a].b[_b]);
    }

모두 비효율적인 방법.

storage vs memory

memory는 휘발성 상대적 가벼움, storage는 덜휘발성 상대적으로 무거움.
aa storage ABC; aa는 memoty에 가깝고 ABC는 storage에 가깝다.

뜬금 메모

  • 10 ^ 18 = 1 이더 , 10 ^ 15 = 1피니
  • require(0.2 ether == msg.value);
profile
개발 취준생

0개의 댓글