블록체인 플랫폼에서 스마트 계약 작성과 구현에 사용되는
계약 지향 프로그래밍 언어
개발자는 솔리디티를 통해서 코드로 실행되는 비즈니스 로직을 스마트 계약에 담아서 구현할 수 있다.
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 |
---|