체인의정석

Types in storage containing (nested) mappings cannot be assigned to. 본문

블록체인/Solidity

Types in storage containing (nested) mappings cannot be assigned to.

체인의정석 2023. 12. 29. 11:56
728x90
반응형

https://hackernoon.com/how-to-solve-struct-containing-a-nested-mapping-cannot-be-constructed-in-solidity

 

How to Solve "Struct Containing a (Nested) Mapping Cannot be Constructed" in Solidity | HackerNoon

How to Solve "Struct Containing a (Nested) Mapping Cannot be Constructed" in Solidity

hackernoon.com

struct content{

address payable owner;

bytes32 hash;

mapping(address => uint) licenses;

}

다음과같이 구조체 안에 배열이 있는 형태의 solidity코드가 있다고 쳐보자.

예전 버전에서 이에 대한 초기화는

function submitContent(bytes32 _hash) public payable returns(uint _id) {

    _id=contents[msg.sender].length;

        contents[msg.sender].push(content({

        owner: payable(msg.sender),

        hash:_hash return(_id);

    }));

}

다음과 같이 한번에 가능하였다. 그러나 solidity 0.7.0 버전부터는 구조체 안의 배열을 초기화 할때는 한번에 하지 못하고 따로 해야 한다고 한다. 기존에는 구조체안의 배열이 memory로 알아서 쓰여져서 에러에 취약했기 때문에 구조체 안의 배열은 스토리지에서만 사용가능하게 만들었다고 한다. 이에 따라서 스토리지로 배열을 명시해서 사용하면 된다고 한다고 한다.

submitContent(bytes32 _hash) public payable returns(uint _id) {

    _id= contents[msg.sender].length;

    content[] storage c = contents[msg.sender];

    c.push();

    c[_id].owner = payable(msg.sender);

    c[_id].hash=_hash;

    return _id;

}

* 해당 방식의 경우 가능하긴 하지만 storage를 쓰기 때문에 조회 함수에 적합하지 않으며 사실상 나중에 api등에서 사용할때 복잡하기 때문에 struct안에 mapping을 넣는 부분은 제거하였으며 대신 하나의 인덱스를 키 값으로 여러개의 mapping을 구현하거나 필요시 이중 메핑 또는 메핑의 vlaue값을 배열로 사용하는 형태로 구현하였다.

 

728x90
반응형
Comments