Klaytn api(KAS)에서 NFT전송시 문의사항

Baobab 서버에서 NFT전송을 테스트중에 발생한 일입니다.
임의로 설명을 위해 KAS에 회원1, 회원2 두개를 만들었습니다.
회원1에서 Wallert에서 지갑계정 1,2,3을 만들고 KIP17로 NFT를 생성해서
NFT를 1개를 회원1 지갑계정1로 발행하였습니다.
회원2에서 Wallert에서 지갑계정 1을 만들었습니다.
Baobab서버 이기에 모두 KLAY를 보유하고 있습니다.

우선 발행한 NFT를 회원1 지갑계정2로 전송을 하니 정상적으로 전송이 되었습니다.
이번에는 회원1 지갑계정2의 NFT를 회원2 지갑계정1로 전송을 하니 정상적으로 전송이 되었습니다.
이제 다시 회원2 지갑계정1에 있는 NFT를 회원1 지갑계정3으로 전송을 할려고하니
Contract not found 라는 메세지가 뜨고 전송이 되지 않고 있습니다.
각 회원은 각자의 key_id 와 secret_key로 API를 호출하였습니다.

여기서 나온 의문사항이 Baobab 서버에서만 다른회원이 만든 NFT Contract를 못찾는건가요?
아니면 Cypress 서버에서도 다른회원이 만든 NFT를 찾을수 없는건가요? 지금 처럼 전송이 되지 않는
이유는 단지 Baobab 서버이기 때문에 전송이 되지 않는건가요?

1 Like

안녕하세요,
KAS 제품팀입니다.

문의주신 사항에 대해서는 내부적으로 확인 후 답변도와드릴 수 있도록 하겠습니다.

감사합니다.

KAS 제품팀 드림,

이해를 돕기위해 소스코드 첨부해 드립니다.

KAS 회원1 정보요약
key_id = “KASWHR…”, secret_key = “ypljgMk…”
wallet
address1 = “0x29841a0B453925313Ae449D17724975B78e407b4”
address2 = “0x54a4e8199Ad92bF286E75f009382b2463D38e739”
address3 = “0x63630687e9c82bA85D65E9C31BACbF9CdD8f5E5F”
KIP-17
Contract Address = “0xbaeb819ef213f0991a5645db0d8936086dcca07f”
Contract Alias = “love-nft”
Token ID = “0x1”

KAS 회원2 정보요약
key_id_2 = “KASWFGJ…”, secret_key_2 = “Pl0dw1…”
wallet
address1 = “0xE027421e3356400380c6E65a649721c3692924F2”


Network Baobab
curl 통신으로 NFT전송 API를 사용
NFT Token ID = "0x1"은 회원1 address1에 "0x29841a0B453925313Ae449D17724975B78e407b4"에 발급되어 있음

step 1. 회원1 address1 => 회원1 address2 (정상작동)

$_contract_address = “0xbaeb819ef213f0991a5645db0d8936086dcca07f”;
$_token_id = 1;
$_token_id_value = “0x”.dechex($_token_id);
$_sender_address = “0x29841a0B453925313Ae449D17724975B78e407b4”;
$_owner_address = “0x29841a0B453925313Ae449D17724975B78e407b4”;
$_to_address = “0x54a4e8199Ad92bF286E75f009382b2463D38e739”;
$_url = ‘https://kip17-api.klaytnapi.com/v1/contract/’.$_contract_address."/token/".$_token_id_value;
$_chain_id = “1001”; //테스트계정(1001) 실제계정(8217)

$_header = array();
$_header[] = “x-chain-id:”.$_chain_id;
$_header[] = “Content-Type: application/json”;
$_param = array(
“sender” => $_sender_address
, “owner” => $_owner_address
, “to” => $_to_address
);
$_body = json_encode($_param);

$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $_url);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlObj, CURLOPT_HEADER, false);
curl_setopt($curlObj, CURLOPT_HTTPHEADER, $_header);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlObj, CURLOPT_USERPWD, $_result[‘key_id’].":".$_result[‘secret_key’]);
curl_setopt($curlObj, CURLOPT_POST, true);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $_body);
$response = curl_exec($curlObj);
$_json = json_decode($response,true);
curl_close($curlObj);
$curlObj = null;

step 2. 회원1 address2 => 회원2 address1 (정상작동)

$_contract_address = “0xbaeb819ef213f0991a5645db0d8936086dcca07f”;
$_token_id = 1;
$_token_id_value = “0x”.dechex($_token_id);
$_sender_address = “0x54a4e8199Ad92bF286E75f009382b2463D38e739”;
$_owner_address = “0x54a4e8199Ad92bF286E75f009382b2463D38e739”;
$_to_address = “0xE027421e3356400380c6E65a649721c3692924F2”;
$_url = 위와 동일
$_chain_id = “1001”; //테스트계정(1001) 실제계정(8217)

$_header = array();
$_header[] = “x-chain-id:”.$_chain_id;
$_header[] = “Content-Type: application/json”;
$_param = array(
“sender” => $_sender_address
, “owner” => $_owner_address
, “to” => $_to_address
);
$_body = json_encode($_param);

$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $_url);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlObj, CURLOPT_HEADER, false);
curl_setopt($curlObj, CURLOPT_HTTPHEADER, $_header);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlObj, CURLOPT_USERPWD, $_result[‘key_id’].":".$_result[‘secret_key’]);
curl_setopt($curlObj, CURLOPT_POST, true);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $_body);
$response = curl_exec($curlObj);
$_json = json_decode($response,true);
curl_close($curlObj);
$curlObj = null;

step 3. 회원2 address1 => 회원1 address3 (발송되지않음)

$_contract_address = “0xbaeb819ef213f0991a5645db0d8936086dcca07f”;
$_token_id = 1;
$_token_id_value = “0x”.dechex($_token_id);
$_sender_address = “0xE027421e3356400380c6E65a649721c3692924F2”;
$_owner_address = “0xE027421e3356400380c6E65a649721c3692924F2”;
$_to_address = “0x63630687e9c82bA85D65E9C31BACbF9CdD8f5E5F”;
$_url = 위와동일
$_chain_id = “1001”; //테스트계정(1001) 실제계정(8217)

$_header = array();
$_header[] = “x-chain-id:”.$_chain_id;
$_header[] = “Content-Type: application/json”;
$_param = array(
“sender” => $_sender_address
, “owner” => $_owner_address
, “to” => $_to_address
);
$_body = json_encode($_param);

$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $_url);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlObj, CURLOPT_HEADER, false);
curl_setopt($curlObj, CURLOPT_HTTPHEADER, $_header);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlObj, CURLOPT_USERPWD, $_result[‘key_id_2’].":".$_result[‘secret_key_2’]);
curl_setopt($curlObj, CURLOPT_POST, true);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $_body);
$response = curl_exec($curlObj);
$_json = json_decode($response,true);
curl_close($curlObj);
$curlObj = null;

에러표기문구
Array
(
[code] => 1104404
[message] => Contract not found
[requestId] => bb3c72f0-85cd-99f9-94ac-6ab0d9930386
)

안녕하세요,
KAS 제품팀입니다.

위와 관련해서 문의주신 사항에 답변드리고자 합니다.
기본적으로 KIP시리즈의 컨트랙트는, KAS API를 통해서 컨트랙트 관련 호출을 진행시에, 특정 KAS 계정에 한해서만 사용가능하도록 되어있습니다.

이를 좀 더 쉽게 설명드리자면,

KAS 계정 A에서 ContractA를 배포했다고 했을때, 배포자가 아닌 다른 KAS계정의 DB에는 ContractA가 조회되지 않습니다.
그렇다고 해서 클레이튼 내에서 사용이 불가능한 개념은 아니고, 토큰 전송 관련 트랜잭션을 실행하고 싶으시다면, 반드시 해당 토큰을 소유하고 있는 계정에서 Wallet API를 활용해 직접 서명해서 트랜잭션을 실행하거나, Node API를 통해 트랜잭션을 실행해야 합니다.

예시를 들어 설명 드려보면
KIP API 사용 가능 시나리오

  1. KAS 계정 A에서 Contract A배포
  2. A의 WalletA에 토큰 A 발행
  3. WalletA의 토큰 A→ KAS 계정 A의 의 WalletB에 전송
  4. WalletB의 토큰 A → 토큰 전송 가능 (모두 같은 KAS 계정 A에 대한 지갑주소이기 때문에 가능)

직접 트랜잭션 서명 후 실행해야 하는 시나리오

  1. KAS 계정 A에서 Contract A배포
  2. A의 WalletA에 토큰 A 발행
  3. WalletA의 토큰 A→ KAS 계정 B 의 의 WalletA 에 전송
  4. KAS 계정 B에게는 Contract A에 대한 정보가 없기 때문에, 직접 토큰 전송 트랜잭션 서명 후 실행 해야 함. (Wallet API, Node API 활용 가능)

Wallet API가 비교적 활용하기 편할 것으로 예상되고, 관련 링크를 공유 드리니 참고하여 보시면 도움이 될 것 같습니다.
KAS Reference Documentation

혹, 추가적인 요청이나 문의사항이 있으실 경우 답변주시기 바랍니다.

감사합니다.

KAS 제품팀 드림,

해당 내용 Wallet API가 비교적 활용하기 편할것이라고 해서 API를 분석을 하다보니
Wallet API에 컨트랙트 실행 트랜잭션을 실행해야 하는거 아닌가 싶던데요.

이걸 실행해볼려고 REQUEST BODY SCHEMA: application/json 내용을 보니
input 을 직접 작성을 해야하는걸 알게 되었습니다.
보내는 트랜잭션에 첨부되며 트랜잭션 실행에 사용되는 데이터라고 설명이 되어 있는데
KAS에서는 이걸 작성을 해줄 부분이 없는건가요?
결국은 EN을 직접설치해서 직접 NFT를 여러 지갑으로 보내는 기능을 구현해야하는건가요?

1 Like

혹시 문제점이 해결되셨을까요? contract a에 한 정보가 없기 때문에, 직접 토큰 전송 트랜잭션 서명을 어떻게 하셨는지 궁금합니다…!!