본문 바로가기

블록체인

블록체인 프로그래밍 - SOLIDITY

이더리움을 바닥에 펼친 모습...?

 

블록체인 플랫폼에서 스마트 계약 작성과 구현에 사용되는 

 계약 지향 프로그래밍 언어 

개발자는 솔리디티를 통해서 코드로 실행되는 비즈니스 로직을 스마트 계약에 담아서 구현할 수 있다.

C++, Python, Javascript 를 기반으로 하는 이더리움 기반의 플랫폼이지만, Klaytn에서도 솔리디티를 활용한다.

 

<Solidity 연습용 예시문>

pragma solidity >=0.7.0 <0.9.0; //*1

contract Practice { //*2
    uint256 public totalSupply = 10;  //*3
    string public name = "KlayLion"; //*3
    address public owner; //*3
    mapping(uint256 => string) public tokenURIs; //*4

    constructor () {
        owner = msg.sender; //*5
    }

    function getTotalSupply() public view returns (uint256) { //*6
        return totalSupply + 100000000;
    }
    
    function setTotalSupply(uint256 newSupply) public {
        require(owner == msg.sender, "Not owner"); //*7
        totalSupply = newSupply;
    }
    
    function setTokenUri(uint256 id, string memory uri) public {
        tokenURIs[id] = uri;
    }
}

 

1. pragma : 컴파일러가 Solidity의 버전이 필요한 버전과 일치하는지 확인하도록 요청하는 데 사용하는 키워드

2. contarct : 리액트의 컴포넌트와 같이 constract를 선언해야 Smart Contract를 진행할 수 있다.

3. uint, string, address : 솔리디티는 정정형식의 언어이기 때문에 각 변수의 형식을 지정해야 한다.(Python과 JavaScript는 동적 형식, C++는 정적 형식), uint는 숫자형, string은 문자형, address는 블록체인 주소

4. mapping : 숫자를 넣으면 글자를 나오게 하겠다는 의미. Python의 딕셔너리같이 key와 value값으로 이해할 수 있다.

5. msg.sender : 스마트 컨트랙트를 실행한, 트랙잰션을 만든 사용자 계정(Account)을 불러온다.

6. public, view : public을 써주면 블록체인에서 값을 바로 볼 수 있고, private라고 쓰면 바로 볼 수 없다. view는 값을 바꾸지 않고 보기만 하는 함수구나 알려준다. 뒤에 returns (unit256)을 써주면 숫자형으로 보여주겠다는 뜻이다.

7. require : (조건, 오류메시지)의 형식. 조건을 만족하면 진행할 수 있고, 아니면 트랙잭션을 실패시킨다.

 

 NFT 
 : 디지털 자산의 일종으로 대체불가능한 특정 암호 디지털 자산. 

디지털 자산에 대한 소유권을 블록체인에 저장함으로써 

위조 및 변조가 불가능하도록 영구 보존하고, 

그 소유권을 탈중앙화한 형태로 확인할 수 있도록 한다.

 

<Solidity NFT 예시문>

contract Practice {
    mapping(address => uint256[]) private _ownedTokens;

    function mintWithTokenURI(address to, uint256 tokenId, string memory tokenURI) public returns (bool) {
        //to에게 tokenURI(글자)가 적힌 tokenID(일련번호)를 발행하겠다
        tokenOwner[tokenId] = to;
        tokenURIs[tokenId] = tokenURI;

        //add Token to the list
        _ownedTokens[to].push(tokenId);

        return true;
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        require(from == msg.sender, "from != msg.sender");
        require(from == tokenOwner[tokenId], "you are not the owner of the Token");
        
        _removeTokenFromList(from, tokenId);
        _ownedTokens[to].push(tokenId);

        tokenOwner[tokenId] = to;
       
    }

    function _removeTokenFromList (address from, uint256 tokenId) private {
        uint256 lastTokenIndex = _ownedTokens[from].length-1;
        for(uint256 i=0;i<_ownedTokens[from].length;i++) {
            if(tokenId == _ownedTokens[from][i]) {
                //Swap last token with deleting token
                _ownedTokens[from][i] = _ownedTokens[from][lastTokenIndex];
                _ownedTokens[from][lastTokenIndex] = tokenId;
                break;
            }
        }
        _ownedTokens[from].pop();
    }
    
    function ownedTokens(address owner) public view returns (uint256[] memory) {
        return _ownedTokens[owner];
    }
}


발행(일련번호, 글자, 소유자)

mint(tokenId, uri, owner)


전송(누가, 누구에게, 무엇을)

transferFrom(from, to, tokenId)

'블록체인' 카테고리의 다른 글

Klaytn(클레이튼) 이란?  (0) 2022.01.11