본문 바로가기

블록체인/솔라나

[beet FixableBeetStruct.deserialize 에러]"offset" is out of range

반응형

@metaplex-foundation/mpl-token-metadata 패키지의 Metadata.fromAccountInfo(accountInfo, 0)[0] 코드를 활용하던 중에 다음과 같은 에러가 발생했다.

[Nest] 19781  - 05/18/2022, 3:26:17 PM   ERROR [ExceptionsHandler] The value of "offset" is out of range. It must be >= 0 and <= 78. Received 1653705784
RangeError: The value of "offset" is out of range. It must be >= 0 and <= 78. Received 1653705784
    at new NodeError (node:internal/errors:371:5)
    at boundsError (node:internal/buffer:86:9)
    at Buffer.readUInt32LE (node:internal/buffer:220:5)
    at Object.read (/home/gus/beet--metaplex-foundation-beet-0.1.0/beet/src/beets/numbers.ts:54:16)
    at Object.toFixedFromData (/home/gus/beet--metaplex-foundation-beet-0.1.0/beet/src/beets/string.ts:58:21)
    at fixBeetFromData (/home/gus/beet--metaplex-foundation-beet-0.1.0/beet/src/beet.fixable.ts:29:17)
    at FixableBeetArgsStruct.toFixedFromData (/home/gus/beet--metaplex-foundation-beet-0.1.0/beet/src/struct.fixable.ts:96:40)
    at fixBeetFromData (/home/gus/beet--metaplex-foundation-beet-0.1.0/beet/src/beet.fixable.ts:29:17)
    at FixableBeetStruct.toFixedFromData (/home/gus/beet--metaplex-foundation-beet-0.1.0/beet/src/struct.fixable.ts:96:40)
    at FixableBeetStruct.deserialize (/home/gus/beet--metaplex-foundation-beet-0.1.0/beet/src/struct.fixable.ts:62:17)

오픈소스 프로젝트이기 때문에, 정식 배포된 버젼의 소스코드에 버그가 있으리라고 생각은 안했지만, 내가 받아온 depenedency 들의 버젼의 문제가 있을 수도 있다고 생각되어 우선은 에러가 발생한 @metaplex-foundation/beet 패키지의 소스코드를 디버깅해보았다.


디버깅 하는 방법은 node_modules 로컬 파일 바라보기 포스팅에서 소개한 yarn link 기능을 통해 위에서 호출한 function 들 속에서 console.log 를 열심히 찍어보았다.


로그를 살펴보니 Buffer 에 담긴 정보를 cursor 를 이동해가며 deserialize 하여 NFT 의 metadata 정보들을 읽어와야하는데, cursor 가 0 -> 33 -> 65 식으로 증가하다가 말도안되게 큰 값인 1653705784 로 설정되면서 Buffer 에서 수용 가능한 offset 을 초과하여 애러가 발생했다.


솔라나의 모든 PubKey 는 같은 SystemProgram 에 의해 생성되지만 어떤 프로그램에게 전가된 주소냐에 따라 다른 정보 (data = buffer) 를 가지고 있게 된다. 필자가 입력한 Pubkey 에는 Metadata.fromAccountInfo(accountInfo, 0)[0] 함수에서 기대하는 정보가 담겨있지 않아서 위 같은 애러가 발생하게 된다.

해당 함수에 NFT 의 mint 주소를 입력했어야 했는데, token 주소를 입력하여 에러가 발생했다.

반응형