타 nft스마트컨트랙트 에 대한 nft 구매 기능 구현 가능 여부 문의

안녕하세요!

궁금점1)
address 말고 다른 정보가 없는 컨트랙트의 nft에 대한 구매 기능이 구현 가능할까요? 가능하다면 어디를 참고하면 좋을까요?

궁금점2)
제가 알고있기론 스마트컨트랙트를 사용하려면 해당 스마트컨트랙트의 address와 abi가 필요한걸로 알고있는데요. 다른 스마트 컨트랙트의 주소만 알고 있는 상황일 때 address 만으로 컨트랙트를 사용하거나 아니면 address로 abi를 구해오거나 하여 스마트컨트랙트를 사용할 수 있는 방법이 있을까요? 있다면 KIP17 컨트랙트에도 마찬가지로 적용할 수 있나요?

감사합니다.

  1. 조금만 더 자세한 설명이 필요할 것 같네요. 다른 컨트랙트의 NFT를 구매한다라는 게, 사용자 개인지갑주소를 통한 NFT구매가 아닌 컨트랙트에서 컨트랙트를 통한 구매를 얘기하는건가요? 아니면 caver를 통해 cli를 통해 구매기능을 원하시는건지요?
    NFT구매는 오픈시 같은곳에서 거래를 통해서 토큰이 trasnfer되게 됩니다. 또는 sell/buy를 구현한 컨트랙트를 통해 거래가 되기도하는데 토큰전송에는 trasnfer가 사용됩니다.

  2. 해당 컨트랙트에만 있는 기능을 사용하기 위해서는 abi값이 있어야 하지만, KIP17과 같은 공용 코드에서 사용하는 기능들 (주로 trasnfer, 등등)은 address만 알고있어도
    KIP17(address).trasnfer (ㄷㅐ충이런느낌이라고 알려드림니다) 이렇게 사용할수 있어요

아 네 답변 감사합니다
제가 아직 잘 알지 못해서 질문이 미숙하고 많은 점 양해 바랍니다 ㅜㅜ

1 질문을 하게된 계기가 제가 직접 nft컨트랙트를 작성하면 transfer과 같은 KIP17표준 nft함수들을 사용할 수 있는데 제가 만든 컨트랙트가 아니라면 그런 기능들을 사용할 수 없다고 생각이 들어서 였어요

2 nft가 개인 지갑으로 들어오기만 하면 돼서 사용자 개인 지갑주소를 통한 nft 구매를 알려주실 수 있나요? caver를 통한 구매 기능도 있는건가요? 있다면 이것도 알려주실 수 있나요? 어떤 걸 참고하면 좋을까요?

3 아 그럼 예를들어 abi가 없어도 nft컨트랙트라면 kip17Instance.transferFrom() 과 같은 KIP17 표준에 있는 함수는 사용할 수 있는건가요?

4 이건 다른 질문이긴한데 kip17Instance.transferFrom() 가 nft구매/판매 함수 인것같은데 그럼 이걸 사용하면 구매를 할 수 있는건가요?

5 그리고 클레이튼 nft면 다 KIP17표준일거고 KIP17표준이면 transfer과 같은 함수들을 지니고 있어야 하니까 nft면 transfer함수로 다 구매시켜버리면 된다던가 하나요?
.

폭풍질문해서 죄송하지만 제 다크서클을 멈춰주실 거라고 믿습니다…!!
감사합니다

Transfer는 토큰 전송기능입니다.
OpenSea 같은 경우를 예로들면 사용자가 NFT를 팔겠다고 올려놓고, 누군가가 구매를 하고 이 거래가 성사된다면 구매자의 NFT에서 판매자의 NFT 로 Transfer하게 됩니다.
이때 판매자는 OpenSea에서 구현된 구매/판매 컨트랙트에 내 NFT에 대한 전송권한을 가질 수 있게끔 approve 시켜줍니다. 따라서 그 이후에 거래가 성사되었을 때 OpenSea에서 판매자의 NFT를 구매자에게 전송하여 거래가 완료되게됩니다.

  1. 그렇습니다

  2. caver.js 에서는 자바스크립트코드로 Trasnfer 기능을 사용할 수 있는것인데 토큰의 거래는 말 그대로 판매자가 구매자에게 NFT를 전송하는것이므로 OpenSea나 기타 NFT 마켓플레이스에서 제공하는 API를 사용하는게 아니라면 개인사용자가 가지고 있는 NFT를 임의로 구매하지 못합니다. (토큰홀더 혹은 토큰 전송권한을 획득한 사이트 혹은 개인만이 Trasnfer가 가능하기때문)

  3. 내가 NFT홀더고, 이걸 사용자에게 나눠주겠다 할때는 trasnfer함수를 이용하여 전송할 순 있지만, 현재로서는 오픈씨와같은 마켓플레이스를 이용하는게 아니라면 해당함수기능으로 구매할 수 없습니다.
    위의 설명대로 trasnfer기능은 토큰전송기능이므로 판매자가 구매자에게 전송하는 방식이 되어야 합니다.

2 Likes

안녕하세요 저도 글 작성자와 비슷한 고민을 하고 있어서 여기다가 댓글로 여쭤봅니다.
저는 현재 NFT를 판매하는 사이트에서 직접 NFT를 스마트 컨트랙트를 활용해 구매할려고
솔리디티를 사용해서 코딩중입니다.

  1. NFT 판매 사이트에서 제공되는 컨트랙트 주소로 kip17Instance.transferFrom() 함수를 사용하여 제가 직접 스마트 컨트랙트를 보내서 민팅을 할 수 있는지 궁굼합니다.
    (제가 말하는 NFT판매 사이트는 opensea 같은 곳이 아니라 새로 NFT를 발행하여 배포하는 과정에 쓰이는 사이트입니다.)

  2. 불가능 하다면 추가적으로 필요한 정보가 어떤게 있을지 말씀해주시면 감사하겠습니다.

  3. 위 질문자의 대한 관리자님의 답변을 보니 토큰이라는 개념이 있더라구요
    NFT 판매 사이트에 스마트 컨트랙트를 보낼때 딱 해당 토큰번호의 NFT를 구매한다고 코딩을 하여 스마트 컨트랙트를 보내야 하나요?? 아니면 무작위 토큰(NFT)를 구매할 수 있는 기능도 구현이 가능한가요?ex) 10번쨰 NFT를 구매한다고 스마트 컨트랙트를 보내야하는지 , 1~10번의 NFT중 무작위로 구매한다고 스마트 컨트를 보내야 하는지,

저도 이제 막 배우고 있는 상황이라 초보적인 질문이지만 답변주시면 감사하겠습니다!

  1. Mint권한은 컨트랙트 배포자 혹은 배포자가 승인한 계정에게 있습니다. 권한이 있다면 가능하겠지만 그렇지 않다면 불가능합니다.
    trasnferFrom 이 자꾸나와서 드리는 말씀이지만 이건 민팅함수가 아니라 전송함수입니다,

function transferFrom(address from, address to, uint256 tokenId) public {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(msg.sender, tokenId), “KIP17: transfer caller is not owner nor approved”);

    _transferFrom(from, to, tokenId);
}

A사용자가 B사용자에게 토큰을 보내는 함수입니다.

  1. 자신이 배포한 컨트랙트가 아니면 민팅할 수 없습니다. ( 일정의 클레이를 입금하면 NFT민팅할 수 있다!라고 하는건 함수를 그렇게 작성해서 동작하는 민팅함수입니다.)

  2. 저는 관리자아니고 저도 그냥 지나가는 초보개발자입니다ㅠㅠ
    그리고 스마트컨트랙트의 개념을 잘못이해하고 계신것 같습니다. 그래서 어떤 기능을 원하시는지 잘 모르겠습니다만… opensea같은곳이 아니라는걸 보니 NFT 퍼블릭세일을 말씀하시는것 같은데…
    해당 NFT컨트랙트에서 어떻게 구현되어있냐에 따라 다릅니다. 보통 퍼블릭세일을 보면 전부다 랜덤 or 순서대로 입니다.

이유는,
a. 사용자는 구매요청을 함.
b. 스마트컨트랙트에서 구현된 기능에 따라서 구매요청을 한 사용자에게 Mint함.

이게 끝입니다. 만약에 NFT아이디를 입력할 수 있게했다라고하면 스마트컨트랙트에서 그렇게 기능을 구현하였겟죠,
따라서 구매자 입장에서는 판매자의 룰을 따를 수 밖에 없습니다.

하나 더 추가하자면 여기서 NFT를 구매한다고 스마트컨트랙트를 보내는 것이 아니라, NFT를 구매한다고 스마트컨트랙트의 함수를 호출 하는것이 좀더 맞는 말인것 같습니다.

답변 감사드립니다 어떻게보면 속보이게 될까봐 제 의사를 명확하게 전달하지 못한 부분이 좀 있는것같습니다
저는 NFT 퍼블릭 세일의 참여를 할 생각인게 맞습니다.
그 NFT 퍼블릭 세일에서 좀 더 효율적으로 NFT를 구매하기 위해 솔리디티 언어를 학습중인부분입니다.
말씀해주신 내용으로 봤을때 어떤 수단과 방법을 동원해도 퍼블릭 세일에서 NFT를 구입하는 방법은
단순히 웹 브라우저에서 민팅을 눌러서 구매 하는 방법 이외에는 없다는 내용으로 받아드려도 될까요??

어떤 수단과 방법…이라고 하면 음 그부분까지는 모르겠지만 제가 아는 지식선에서는

  1. 웹페이지를 통해 구매 .
  2. 자바스크립트를 이용하여 web3.js 등으로 코드를 직접 구현하여 구매. (이건 웹페이지에서 제공하는 기능이랑 똑같긴합니다)
  3. 컨트랙트에서 해당 NFT컨트랙트의 주소를 통한 Mint…이나 이것또한역시 1번2번과 다를게 없습니다. 해당 퍼블릭세일을 진행하는 NFT 컨트랙트의 함수로 접근을 한다는 관점에서 1,2,3번이 모두 동일합니다. 임의로 이미 배포된 컨트랙트를 수정할 순 없기때문에 이처럼 일반적인 상황에서는 이 외에 다른방법으로 구매하기는 어려울것 같습니다.

아마 봇을 이용한 구매 같은것을 원하시는것 같긴 합니다만…
2번의 방법으로 타이머 등을 이용하여 코드상으로 직접 민팅을 시도하는 방법.
3번의 방법으로 자신의 컨트랙트를 이용하여 특정 블록타임에 해당 NFT컨트랙트의 퍼블릭세일 관련된 함수기능을 실행하는 방법 등으로 시도해볼수 있을 것 같아요

저도 이부분은 생각만하고 실제로 해보진 않아서 이 이상 정확한 답변은 어려울것같네요 ㅠ

1 Like

넵 답변 정말 감사합니다 !! ㅎㅎ 많은 도움이 됐습니다