체인의정석

오픈씨 스마트 컨트렉트 구매 패턴 분석 본문

블록체인/NFT & BRIDGE

오픈씨 스마트 컨트렉트 구매 패턴 분석

체인의정석 2022. 3. 16. 14:04
728x90
반응형

먼저 오픈씨는 #Rinkeby네트워크 에서 테스트가 가능하다.

 

우선 오픈씨를 테스트 하기위하여 간단한 NFT를 배포해 볼 수 있다.

NFT를 배포하는 부분은 일단 생략하기로 하겠다.

https://it-timehacker.tistory.com/210

 

hardhat 사용법 정리 02- ERC721 배포해보기

이어서 하드햇과 오픈제플린 라이브러리를 연결하는 부분부터 진행을 하도록 한다. https://docs.openzeppelin.com/upgrades-plugins/1.x/hardhat-upgrades Using with Hardhat - OpenZeppelin Docs You can also..

it-timehacker.tistory.com

지난번에 올린 배포하는 법을 참고해서 하면 된다.

 

아니면 리믹스에서 배포하는 간단 코드는 #리믹스코드배포

pragma solidity ^0.8.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";

contract EthanToken is ERC20, Ownable {
    constructor() ERC20("EthanToken", "ET") {
    }
    function mint(uint256 amount) public onlyOwner{
        _mint(_msgSender(),amount);
    }
}

요런식으로 하면 된다. 하드햇으로 짜다보니 지금은 ERC20밖에 없지만 나중에 따로 만들어서 다 정리할 예정이다.

 

일단

 

만들어진 토큰으로 시도를 하겠다.

#openseaTestnet #오픈씨테스트넷  은 아래 사이트에서 이용 가능하다.

https://testnets.opensea.io/

 

 

1. 판매등록 과정 분석

일단 리스팅 부터 하겠다.

 

 

수수료 총 12.5% 가격 100이더로 놓고 판매를 누르면 총 3개의 스텝이 나온다.

1단계
1번째 실행함수 - initialize wallet

https://rinkeby.etherscan.io/tx/0x7c5e5e22580af2db6f54efbc92aed036b22860b54da2f7f48efa64856214da83

 

Rinkeby Transaction Hash (Txhash) Details | Etherscan

Rinkeby (ETH) detailed transaction info for txhash 0x7c5e5e22580af2db6f54efbc92aed036b22860b54da2f7f48efa64856214da83. The transaction status, block confirmation, gas fee, Ether (ETH), and token transfer are shown.

rinkeby.etherscan.io

처음에 대한 내용은 위의 트랜잭션에서 볼 수 있다. 

인터널 트랜잭션을 보면 register Proxy가 나온다.

delegate call로 무언가가 만들어 진것을 볼 수 있다.

프록시 컨트렉트로 지갑을 만드는게 아닐까 싶다.

"To get set up for selling on OpenSea for the first time, you must initialize your wallet, which requires a one-time gas fee."

오픈씨에서의 지갑 등록은 딱 한번만 이루어진다.

2번째 approve

ERC721의 setApproveForAll을 사용한다.

상호작용하는 각 컨트렉트별로 한번씩 사용하면 된다.

 

3번째 coinfrim

Wyvern은 레이어2를 이용한다고 되어 있으며, 2018년 이후로 새로운 업데이트가 없다.

오픈씨가 매수를 했거나 돈을 주고 독점한게 아닐까 싶다.

 

일단 1250 숫자를 통해 판매할때는 makerRelayerFee에서 

maker (거래를 making 하는쪽에서 내는 비용) 인거 같다.

해당 서명은 수수료를 받는 주소, 여기선 오픈씨가 되는거 같다.

exchange 는 wyvern exchange를 나타낸다.

 

해당 내용은 트렌젝션으로 기록되지는 않는다.

 

레이어 2에서 사용하기 위하여 정보를 제공하는것에 대해 미리 서명을 받아놓고 이는 누군가가 구매할때 해당 정보를 불러와서 구매를 할 것이다.

 

 

Lower price - 가격을 내리는 명령어 (수수료가 발생하지 않음)

가격을 낮추는것은 Lower Price 인데 서명에 들어가는 정보를 비교 해보면

basePrice 부분만 바뀌는것을 볼 수 있다.

한마디로, NFT의 판매 상태가 블록체인에 기록은 안되더라도 Wyvern 컨트렉트에 저장된다고 볼 수 있다.

이 정보는 추후 누군가 구매될 때 트랜잭션을 동시에 (atomic) 발생시키기 위해서 사용될 것이다.

따라서 지금은 가스비가 발생하지 않는다.

2. 구매 과정 분석

NFT를 리스팅 한 계정과 다른 계정으로 접속을 하여 구매를 실행

크리에이터 수수료 체크

Atomic Match 함수 실행

구매완료

Atomic match 실행

수수로는 오픈씨 계정으로 가고 이더리움은 판매한 사람에게 토큰은 나에게로 전송, 판매자가 서명한 fee 가 이때 빠져나가서 fee를 받는 주소로 들어가게 된다.

 

이 요청은 Wyvern Exchange 컨트렉트로 가서 실행되게 된다.

Proxy contract를 써서 해당 컨트렉트에 직접 트랜잭션이 찍혀 있음을 확인할 수 있었다.

 

결론

Wyvern Exchange는 판매 등록 시에 NFT를 올리거나 판매정보를 바꿀때마다 이를 저장하고 있다가.

누군가가 해당 NFT를 사면 해당 정보를 바탕으로 한번의 트랜잭션으로

 

1. 수수료 회수(오픈씨) + 판매금 지급(판매자)

2. NFT 전송 (구매자)

를 한번에 해서 이름이 atomic match 이다.

 

 

 

 

 

#오픈씨분석 #오픈씨컨트렉트 #오픈씨코드 #OpenseaContract

728x90
반응형
Comments