Klaytn

장민우·2023년 1월 5일
0

Solidity

목록 보기
3/6

Klaytn

KLAY - KLAYTN

클레이튼의 정의에 대해서 인용합니다.

카카오의 블록체인 기술 관련 자회사 그라운드X가 개발한 클레이튼은 비트코인처럼 하나의 코인이 아닌 이더리움이나 이오스
같이 분산어플리케이션 디앱을 만들기위한 중앙 플랫폼이다. 클레이튼 플랫폼의 가장 큰 특징은 블록체인 기술의 핵심 요소인 탈중앙화를 
현시점에서는 다소 포기하더라도 대중화에 필요한 기술적인, 제도적인 기반을 먼저 갖추는 것이다.
사용자의 인터페이스(UI)와 경험(UX)의 최적화를 통해서 많은 대중들이 쉽고 간편하게 이용하여 최대한 많은 사람들은 끌어들이려는 목표이다. 
당장의 현실적인 타협 속에서 점진적으로 완전한 탈중앙화를 달성해 나갈 계획이다. 현재 클레이튼은 합의가 필요한 작업은 
컨소시엄 노드(기업 협의체)에서 처리하고, 합의가 필요하지 않은 작은 작업은 퍼블릭 노드에서 처리하는 하이브리드 방식으로 운영하고 있다.

요약하면, 카카오의 블록체인 기술을 기반으로 한 디앱을 만들기 위한 "중앙 플랫폼" 의 하나라는 것이다.


 클레이 ( KLAY )의 정의에 대해서 인용합니다.

그라운드X의 자체 클레이튼 기반 토큰으로 플랫폼 내에서 기축통화처럼 사용하는 암호화폐이다.즉, 
클레이튼 (KLAYTN)은 블록체인 기술의 메인 넷에 해당되는 플랫폼의 이름을 지칭하며, 클레이 (KALY)는
해당 메인 플랫폼에서 화폐로 통용되는 암호화폐의 이름이다.

클레이튼은 이더리움을 표본을 삼아 제작을 했습니다. 그래서 기본적인 문법의 구조는 동일한 Solidity를 이용합니다.

👇 제가 정리한 링크를 달아두겠습니다. 꼬마개발자 Link

KIP-17

KIP-17은 대체 불가능한 토큰 (Non-fungible Token)에 대한 표준입니다. 따라서 고유한 가치를 가지고 있으며

각 토큰 간의 호환이 불가능합니다. KIP-17의 표준 인터페이스를 통해 wallet/ broker/ auction 어플리케이션들은

클레이튼에 NFT와 함께 작동될 수 있습니다. 또한, 클레이튼은 간단한 KIP-17 스마트 컨트랙트와 임의의 많은 양의

NFT들을 추척하는 컨트랙트를 제공합니다. KIP-17은 ERC-721 토큰에서 파생되었으며 차이점은 다음과 같습니다. 

 

KIP-17 과 ERC-721 의 차이점

모든 토큰의 transfer/ mint/ burn 작업은 이벤트 로그별 추적을 거쳐야 합니다.
즉, 송금 작업은 무조건 transfer/ mint/ burn 관련된 모든 작업에서 발생되어야 합니다.
ERC-721의 지갑 인터페이스가 ERC-721과 호환되도록 지원합니다.

KIP-17 기능

balanceOf(address) : 해당 주소에 NFT의 개수를 반환합니다.

function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "KIP17: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }
~~~
ownerOf(uint256) : 해당 NFT 토큰아이디에 소유자 주소를 반환합니다.
~~~solidity
function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "KIP17: owner query for nonexistent token");

        return owner;
    }

approve(address, uint256) : NFT 소유자가 전송, 삭제 권한을 승낙하는 기능입니다.

function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "KIP17: approval to current owner");

        require(msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "KIP17: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

setApprovalForAll(address, bool) : 현재 자신이 가지고 있는 NFT 모든 권한을 승낙하는 기능입니다.

function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender, "KIP17: approve to caller");

        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

_mint(address, uint256) : NFT를 발급하는 기능입니다.

function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "KIP17: mint to the zero address");
        require(!_exists(tokenId), "KIP17: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

        emit Transfer(address(0), to, tokenId);
    }
```
_burn(address, uint256) : 해당 NFT를 burn(삭제) 하는 기능입니다.
~~~ solidity
function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "KIP17: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
```
_transferFrom(address, address, uint256) : 소유하고있는 NFT를 다른 사용자에게 전송하는 기능
```solidity
function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "KIP17: transfer of token that is not own");
        require(to != address(0), "KIP17: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
```
##### 제가 생각하는 KIP-17의 주요 기능들을 정리해 봤습니다.

이와 같이 KIP-17은 ERC721과 동일한 부분이 많습니다. ERC721 개념을 이해하고 있으면 클레이튼 KIP-17 개발도 어렵지 않게 할 수 있습니다.

### 소스코드(일부)

```solidity
pragma solidity ^0.5.6;

// 직접 제가 작성한 소스코드 일부를 발췌 했습니다.

function KlaytnBatchMint(address to, uint amount, string memory path, address[] memory royaltyRecipients, uint256[] memory royaltyValues, uint256[] memory price, uint256 _biddingTime, bool _payType) public onlyOwner{
        
        require(price.length == amount , "KIP17: Arrays length mismatch");

        require(amount == royaltyRecipients.length &&
                amount == royaltyValues.length,
                'KIP17: Arrays length mismatch');

        setTokenURI(path);
        
        for (uint i = 0; i < amount; i++) {
            KLAYSafeMint(to,price[i],royaltyRecipients[i],royaltyValues[i],_biddingTime, _payType);
        }

    }
    
 // 해당 KIP-17 방식은 한번에 하나씩만 NFT를 발급할 수 있었습니다.
 // 그 기능을 한번에 대량으로 NFT 발행할 수 있는 형식으로 변경해서 사용했습니다.
 function KLAYSafeMint(address to, uint256 price, address royaltyRecipients, uint256 royaltyValues, uint256 _biddingTime, bool _payType) public onlyOwner {
        tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _mint(to, tokenId);
        string memory tokenURIs = tokenURLs(tokenId);
        _setTokenURI(tokenId, tokenURIs);
        tokenIds.push(tokenId);
        _setTokenRoyalty
        (
            tokenId,
            royaltyRecipients,
            royaltyValues
        );
        if (_payType) {
            SallerInfo memory saller;
            saller.owner = msg.sender;
            saller.price = price;
            sallerOwner[tokenId] = saller;
            createBid(_biddingTime,msg.sender,tokenId);
        }
        emit NftCreate(tokenId,to);
    }
```

### 회고록

클레이튼도 이더리움도 같은 규약을 기반으로 제작되었다 보니 너무 어렵지 않게 적응을 할 수 있었습니다.
기본적인 기능들과 주요 기능만 알고 있다면, 누구든지 NFT 개발을 진행할 수 있다고 생각을 했습니다.
제가 정리한 부분이 부족한 부분이 많지만 좋게 봐주시면 감사하겠습니다.

다음 포스팅은 "이더리움 ERC721"를 정리해 보겠습니다.

 
profile
꿈틀대는꼬마개발자

0개의 댓글