Require('caver-js-ext-kas') 호출시 문제

(2020년 10월 22일, 진행)

npm install caver-js-ext-kas

source code에서

const CaverExtKAS = require(‘caver-js-ext-kas’)
const caver = CaverExtKAS()

를 호출하면

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/ [path] /node_modules/caver-js-ext-kas/index.js
require() of ES modules is not supported.

라는 메시지가 뜹니다.

해결방안이 있을까요? 아니면 다른 버전을 설치해봐야 하는지…

감사합니다.

안녕하세요 질문 주셔서 감사합니다 ^^

먼저 노드 버전 확인이 가능할까요?

노드 버전과 관련된 이슈인 것 같은데, 참고하실 수 있는 링크 첨부하겠습니다.


네 감사합니다.
저도 구글링을 했을 때 유사한 내용을 확인했는데,
보내주신 내용 외에 별다른 정보는 얻지 못했습니다.

const 대신 import를 써야한다면… ㅠㅠ

docs에 기술된 12.18.0 버전에서 동작을 해야하는데… 안되는 것 같습니다.
제가 12.18.0 에서 테스트 중인데요.

더 진행해보고 댓글로 업뎃할께요.

감사합니다. :slight_smile:

@Jamie
참… 제가 node로 backend server를 구동하고
거기서 caver-js-ext-kas를 사용하려고 하는데…
이런 경우를 지원하기 위한 계획이나 현재 지원하는 node version이 있는지요?

3rd party 개발사라면 위와 같은 상황이 일반적일 것 같습니다.

확인 부탁드립니다. :slight_smile:

음 12.18.0 버전에서 해당 문제 확인했습니다.

노드 버전 별로 테스트를 해서 지원 가능한 노드 버전을 문서에 업데이트 해야 할 것 같습니다. ^^

일단 지금 이슈 해결을 위해서 노드 10 버전대(10.16.0/10.15.0) 혹은 12.19.0 버전의 node를 사용하도록 수정해 주실 수 있으실까요?

1개의 좋아요

네 우선 그렇게 진행해보도록 하겠습니다.

추가로 질문이 있습니다.

kas를 이용해서 NFT 전송, 조회 등을 해보려고 하는데 docs에 보니 조회와 관련된 것은 http call 만 지원하는 것 같습니다.

다시 말씀드리면, NFT에 대하여

  1. caver-js + public EN 환경에서 되던 기능들이
  2. caver-js + KAS 환경
    또는
    caver-js-ext-kas + KAS 환경
    에서는 지원이 안되는 것 같습니다.

1)에서는 정상으로 처리되던 것이
2) 또는 3)에서는 결과가 대부분 “Returned values aren’t valid, did it run Out of Gas?” 입니다.

klip partners 를 통해 발행한 NFT에 대해서
저희 서비스 내부의 EOA 끼리 주고 받는 기능을 만들다가 만난 이슈들입니다.

감사합니다.

글만 읽어서는 어떤 이슈인지 파악하기 어려운데, 조금 더 자세하게 설명을 부탁드려도 될까요?
예제를 하나 들어서 설명해 주시면 더 좋을 것 같습니다.

제가 너무 주관적으로 이야기를 했습니다. 양해 부탁드리고요… ~

진행한 순서는 이렇습니다.

KAS 공식 오픈 전까지, 저희는 public-en을 사용하고 있었으며, 지금은 KAS를 적용하기 위해 test를 진행하고 있습니다.

저희는 FT(KIP7) 기반의 token을 배포해서 서비스에서 사용하고 있으며,
cave-js-ext-kas를 적용했을 때 현재 저희 서비스에서 필요한 기능들이 정상적으로 동작하는 것을 확인하였습니다.
(caver-js + publicEN, caver-js-ext-kas + KAS) 둘 다 정상동작 확인.
==> 여기까지는 FT 에 대한 내용입니다.

그런데 저희가 NFT를 도입하기 위해서 klip partners에 가입했고, NFT(card라고 부르더군요)를 발행하였습니다.

partners에서 제공하는 API는 partners에 가입해서 받은 계정(EOA)만
사용할 수 있는 API라는 제약이 있어서,
(API가 확장될 것으로 생각하지만, 아직은 아니라서 임시방편으로 아래 기술된 기능을 만들었습니다.)
저희 서비스 내부의 회원(EOA)들끼리 NFT(card)를 주고 받기 위해
const kip17 = new caver.kct.kip17(contractAddr);
의 방식으로 transferFrom을 호출했고
card가 정상적으로 전송되는 것을 확인했습니다.
물론 환경은 caver-js + public-EN 에서 확인했습니다.

이 상황에서 아래 2가지 issue를 확인했고, 해결하고자 합니다.

1) NFT(card) 토큰정보 조회


Caver SDK (caver-js, caver-java)는 Token History API를 지원하지 않습니다.
라고 기술돼 있었고,

따라서 당연히 caver-js-ext-kas도 지원을 하지 않을 것으로 생각했으며,
let owned = await kip17.ownerOf(cardID)
let uri = await kip17.tokenURI(cardID);
등으로 테스트를 해보니
’Returned values aren’t valid, did it run Out of Gas?’ 라고 응답을 받았습니다.

그래서 현재는 KAS에서 추천하는 curl 방식으로 토큰정보조회 기능을 구현하고 있습니다.

2) 스마트컨트랙트 실행 : transferFrom
(caver-js + publicEN 환경에서는 정상동작하고 있습니다만…)

KAS를 도입하기 위해서 진행하던 중


의 내용을 살펴보니 별다른 제약은 없지만,
API를 호출하는데, transferFrom의 input
(docs 에 나온 예시를 보면
input: ‘0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000’,
)
과 같이 bytecode를 입력하라고 돼 있는데, 제가 아직 그 값은 몰라서 알아보고 있습니다.
위에 언급드렸듯, klip partners에 가입해서 받은 NFT(card)라 contract 의 address외에 abi 및 bytecode 등은 제가 모릅니다.
(혹시 알려주실 수 있는지요? ) mint, burn, transferFrom 등입니다. ~
==> 여기까지가 NFT(card)관련 내용입니다.

https://docs.klaytn.com/ 에는 input을 함수이름(transferFrom)으로 명시적으로 사용해도 되는데,
https://docs.klaytnapi.com/ 에는 input을 bytecode로 사용하라고 돼 있네요.

혹시 NFT도 docs.klaytn.com 에서 제시하는 방식대로 진행해도 무방한지 궁금합니다.

뭐 제가 임의로 함수이름을 명시해서 테스트를 해볼까 생각을 하고 있습니다.

내용이 좀 길었습니다.

그럼 확인 부탁드립니다.

문서에 나와있는 문구가 조금 혼란스러울 수 있겠네요. ;-;
caver-js / caver-java 에서는 TokenHistory API를 지원하지 않지만 caver-js-ext-kas / caver-java-ext-kas 에서는 Token History API를 사용할 수 있습니다. 해당 문구는 문서에서 제거하도록 하겠습니다.

그래서 문의주신 내용에서 보면

  1. NFT(cavrd) 토큰정보 조회
    이 예제에 보시다 시피 caver.kas.tokenHistory.getNFT를 사용하시면 됩니다.

  2. 스마트 컨트랙트 실행
    일단 bytecode는 함수 시그니처 + 파라미터가 함께 인코딩된 값입니다.

이 값을 구하기 위해서는 abi가 따로 필요한데 이를 모르시고 계시다면 Klip 사에 abi 요청을 따로 하셔야 할 것 같습니다.

하지만 기존에 caver-js + publicEN 환경에서 정상동작 하고 있었다면 caver.kct.kip17 (혹은 caver.klay.KIP17)을 사용하셨던 것으로 이해가 되는데, 만약 caver-js에서 제공되는 NFT(KIP17) 클래스로 정상적으로 동작하고 있었다면 여기에 보시면 kip17JsonInterface 라는 이름으로 caver에서 사용하는 abi가 제공되고 있습니다. 이 abi을 사용하여 caver.abi.encodeFunctionCall을 통해 input에 넣을 스트링을 구할 수 있습니다.

또한 위의 상황에서 조금 더 간단하게 input 값을 구하는 방법으로는

const kip17 = new caver.kct.kip17(‘0x{contract address}’)
const input = kip17.methods.transferFrom('0x{from address}’, '0x{to address}’, tokenId).encodeABI()

위와 같은 방법으로 transferFrom의 파라미터를 넘겨준 후, encodeABI() 를 호출하여 input값을 구하실 수 있습니다. 참고로 이 방법은 KIP17 클래스가 Caver의 Contract 클래스를 상속받아 구현되었기 때문에 사용할 수 있는 기능으로 자세한 내용은 여기 을 참고하시면 됩니다 ^^

만약 caver-js v1.4.1 이하 버전을 사용하고 계시다면 위의 예제에서 caver.kct.kip17caver.klay.KIP17로 아래와 같이 변경하시면 됩니다.

const kip17 = new caver.klay.KIP17(‘0x{contract address}’)
const input = kip17.methods.transferFrom('0x{from address}’, '0x{to address}’, tokenId).encodeABI()

충분한 답변이 되었으면 좋겠네요 :slight_smile: 혹시나 막히시거나 이해가 안되는 부분이 있으시면 편하게 말씀해 주세요.

빠르고 자세한 답변 감사드립니다.~

의견주신대로 진행해보고 문의드리도록 하겠습니다.
(일부는 진행해서 아래 다시 기술했습니다.)

현재 node version 12.19.0 에서 caver-js-ext-kas 설치하고,

npm install caver-js-ext-kas
(제 서비스 package.json에는 “caver-js-ext-kas”: “^1.0.0” 로 확인되네요.)

이 상태에서 서비스를 실행하면, 아직 동일한 에러가 출력됩니다.
require() of ES modules is not supported.

그래서 설치된 caver-js-ext-kas의 package.json 파일의 “type” : “module”
이 부분을 삭제하고 실행하면 저 위 에러는 사라집니다.

이 상태에서 FT 관련 기능은 publicEN 이든 KAS 든, caver-js든 caver-js-ext-kas 든 상관없이 정상 동작하는 것을 확인했습니다.

다만, 아직까지 NFT 쪽 기능
1)
let caver = new CaverExtKAS(new CaverExtKAS.providers.HttpProvider(blockchain.kas.provider, blockchain.kas.option));

kip17 = new caver.kct.kip17(klipwallet.nftAddr);
let result = await kip17.tokenURI(cardID)
라고 호출하면 , ’Returned values aren’t valid, did it run Out of Gas?’ 라고 응답이 옵니다.

물론 public EN 에서는 정상적으로 조회가 되는 기능입니다.

klip partners를 통해서 생성한
NFT의 transferFrom 도 caver-js + public EN 환경에서는 정상 동작하나,

caver-js-ext-kas + KAS 환경에서는
catcherror occurred Error: Returned error: invalid fee payer

라는 메시지가 나옵니다.
(대납계정을 통해서 호출하고 있는데, 제가 뭔가를 잘못하고 있는지 아님 KAS의 이슈인지… 아직은 파악을 못하고 있습니다. 다만, public EN에서는 잘 된다는 게 참… 애매합니다.)

확인 부탁드립니다.

네 “type”: "module"은 아마 다음 릴리즈에 빠져서 배포될 수 있을 것 같습니다 ㅠ

  1. 먼저 KAS API를 사용하기 위해서는 initialization 과정이 필요합니다. 이 과정에서 chain id, access key is, secret access key를 세팅합니다.
    여기에 나와있듯이 caver.initKASAPI를 사용하면 node api, token history api, wallet api, anchor api 모두 kas production url으로 세팅이 됩니다. 만약 api 별로 인증키를 다르게 세팅하거나 url을 따로 세팅하고 싶은 경우에는 caver.initNodeAPI / caver.initWalletAPI / caver.initTokenHistoryAPI / caver.initAnchorAPI 함수를 사용하면 됩니다.
    NFT 조회 기능은 따로 TH API를 사용하지 않는 이유가 있으신가요? KIP17 클래스는 Node API를 사용하고 있기 때문에 caver.initKASAPI 혹은 caver.initTokenHistoryAPI를 수행해 주셔야 합니다.
    아래에는 제가 테스트한 예제를 첨부하겠습니다.

    const caver = new CaverExtKAS(‘https://node-api.dev.klaytn.com/v1/klaytn’)
    caver.initKASAPI(1001, prodId, prodPw)

    const kip17 = new caver.kct.kip17(‘0x45e6c4e57ff6fc0865dbbe1639a18a6362049cca’)
    const uri = await kip17.tokenURI(‘0x2’)
    console.log(uri)

  2. 1번과 마찬가지로 caver.initKASAPI를 사용하여 권한 초기화 부탁드립니다.

2개의 좋아요

항상 친절한 답변 감사합니다.

말씀주신 방식으로 해보겠습니다.
(노드 버전 이슈가 워낙 커서 … ^^;)

이것저것 막 하다보니 저도 좀 헷갈리네요

도움주신대로 하고 정리해보겠습니다

항상 감사합니다 :slight_smile:

1개의 좋아요

caver-js와 caver-js-ext-kas, klip partners(NFT), public en, KAS 등 다양한 것들을 살펴보고 적용하고 있는데,

서비스 운영 변수로 필요한 정보를 config 파일에 선언해놓고,
운영 환경에 맞게 runtime 시에 불러다 사용하는데, caver-js와 caver-js-ext-kas가 뒤섞여서 제대로 검증되지 않은 테스트 결과를 기반으로 @_Jasmine님께 문제 제기를 했던 것 같습니다.

FT token의 경우가 caver-js를 설정하듯, caver-js-ext-kas도 설정하면 되는 것을 확인한터라
NFT도 그렇게 될 것으로 생각하고 initKASAPI 대신
CaverExtKAS.providers.HttpProvider(blockchain.kas.provider, blockchain.kas.option));
를 썼는데, 결국 이게 문제였습니다.

공유해주신 대로 기본에 충실하게 설정하니 정상동작하는 것을 확인하였습니다.
제가 매우 초보적인 실수를 했네요.

그나마 다행이라면 대충 봤던 docs 정보들을 꼼꼼하게 살펴보게 됐습니다.

많은 도움 주셔서 감사합니다. :slight_smile:

2개의 좋아요

네네 감사합니다 ^^ 앞으로도 편하게 질문 주세요!! :slight_smile: 좋은 하루 되세용~

1개의 좋아요