[Solidity] CompilerError: Stack too deep when compiling inline assembly 조치방법

in upvu •  2 years ago 

CompilerError: Stack too deep when compiling inline assembly: Variable value0 is 3 slot(s) too deep inside the stack.

Error HH600: Compilation failed

Solidity를 코딩하다가 위와 같은 이유로 에러를 만났습니다.

이유는 아래 코드 때문인데요.

function hashOrder(Order memory order) public pure returns (bytes32 hash) {
        return
            keccak256(
                abi.encode(
                    ORDER_TYPEHASH,
                    order.exchange,
                    order.maker,
                    order.taker,
                    order.saleSide,
                    order.saleKind,
                    order.target,
                    order.paymentToken,
                    keccak256(order.calldata_),
                    keccak256(order.replacementPattern),
                    order.basePrice,
                    order.endPrice,
                    order.listingTime,
                    order.expirationTime,
                    order.salt
                )
            );
    }

abi.encode 내부에 parameters가 여러개가 포함되는데, 컴파일시 내부적으로 이 파라미터들이 Stack에 쌓이게 되는데 총 16개 이상 넘어 갈 수 없게 되어 있다고 합니다.

그래서 이러한 경우 abi.encodePacked를 이용하여 아래와 같이 쪼갤 수가 있습니다.

function hashOrder(Order memory order) public pure returns (bytes32 hash) {
        return
            keccak256(
                abi.encodePacked(
                    abi.encode(
                        ORDER_TYPEHASH,
                        order.exchange,
                        order.maker,
                        order.taker,
                        order.saleSide,
                        order.saleKind,
                        order.target,
                        order.paymentToken,
                        keccak256(order.calldata_),
                        keccak256(order.replacementPattern)
                    ),
                    abi.encode(
                        order.basePrice,
                        order.endPrice,
                        order.listingTime,
                        order.expirationTime,
                        order.salt
                    )
                )
            );
    }

이것으로 위 Compiler Error은 해결 완료!!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!