스마트 컨트랙트 , 솔리디티 (Solidity)
스마트 컨트랙트라는 것은 블록체인에 저장되어있는 프로그램이다. 어디에 저장되어있는지 알기위해 주소를 쓴다. 주소를 쓰는것이 어카운트이다보니 어카운트와 같이 취급을 하게된다. 이더리움 코드를 까보면 어카운트라는 값이있고, 어카운트 안에 코드해쉬라는 값이 있다. 이는 어떤 코드를 해쉬했더니 나온 값인데, 이것을 가지고 블록체인에 저장되어있는 코드를 불러올 수 있는 구조이다.
스마트 컨트랙트는 상태를 가지고, 이러한 상태를 변경할 수 있는것은 TX 밖에 없다. 그러다보니 TX 로 컨트랙트를 실행하고, TX 의 결과가 컨트랙트에 반영된다.
스마트 컨트랙트는 함수와 상태로 되어있고, 함수를 쪼개보았더니 상태를 변경하는 함수 와 상태를 변경하지 않는 함수 두개로 나뉜다.
Solidity
블록체인은 포인터의 개념이 없기때문에 type 값들은 메모리주소값을 가리키지 않고 블록체인의 주소를 가리키게된다.
uint 는 unSignedInteger 의 약자로 항상 양의 정수를 나타낸다.
Solidity 예제 1
pragma 에 버전을 명시하지 않으면 compiler 의 버전대로 작동하게되어있어서 꼭 명시하는게 좋다.
참고로 클레이튼은 0.4.24 ~ 0.5.6 버전을 지원한다.
mapping 타입은 주소 키값을 주면 그 주소에 매핑되어있는 unSignedInteger 값을 받을 수 있다.
Event 를 정의하면 Listening 을 할 수 있게 된다.
Solidity 예제 2
영어로 mintting 은 주조한다라는 용어로 코인을 찍어낼때 mintting 한다라고 한다.
Message 의 Sender 는 최초의 사용자를 말한다. 그런데 TX 의 Sender 는 바로 앞 Contract 또한 Sender 가 될 수 있다.
따라서 위그림의 msg.sender 는 컨트랙트를 배포한 사람을 말한다.
from 이 빠져있다. 이는 from 이 msg.sender 로 유추가능하기에 생략해도된다.
emit 은 정의된 Event 를 발생시킨다.
===>
이상으로 상태값이 2개였고 이벤트가 1개였고, Constructor 가 1개였고, mint 와 send 라는 함수 2개가 있는 가장 간단한 ERC-20의 토큰 컨트랙트를 만드는 과정이었다.
솔리디티 컴파일링
ABI 는 이 컨트랙트가 실행할 수 있는 함수가 어떤것이 있는지 정의한 JSON 이다. 보통 이것은 프로그램에서 프로그램 헤더와 같은 역할이라 생각하면 된다.
Klaytn SDK(Software-Development-Kit)
참고 : https://docs.klaytn.foundation/dapp/sdk
클레이튼의 경우 탈중앙화 성격이 이더리움만큼 강하지않다.(참여가 제한적임) 또한 탈중앙화가 블록체인의 유일한 속성도 아니기에 클레이튼에서는 블록체인기술을 활용한 App 을 Blockchain-Application, BApp 이라고 부른다.
Klaytn 은 네트워크가 3가지가 존재한다. Cypress와 Baobab 그리고 Aspen 이 있다.
Cypress 는 main net 이다 때문에 토큰이 있어야 GAS 비를 낼 수 있다.
Baobab 은 목적 자체가 테스트 net 이다. 때문에 테스트넷의 토큰은 쉽게 구할 수 있게 되어있다.
getBlockNumber() 함수를 통해 가장 마지막 즉, 가장 최신의 블록 번호를 얻을 수 있다.
참고 : https://scope.klaytn.com/ 를 들어가면 Klaytn 의 블록정보들을 볼 수 있다.
여기서의 wallet 은 어카운트의 데이터를 잠깐 담아놓기위한 컨테이너 개념이다.
klay.accounts.create() 를 실행하면 비밀키-공개키이자 클레이튼에서 사용가능한 키페어가 생성된다.
이렇게 생성한 키페어는 일종의 데이터이며, wallet 은 데이터를 사용하기 쉽게 만들어준다.
이제 서명된 TX 는 전송될 수 있다.
sendSignedTransaction 이 있다. 여기에 .on() 을 하는것이 중요하다.
.on() 은 Event 를 Listening 하는 함수다. 때문에 첫번째 .on() 함수는 'transactionHash' 라는 Event 가 존재하면 다음 인자의 함수를 실행한다라는 뜻이다.
'transactionHash' 라는 이벤트는 노드가 트랜젝션을 받았을때 잘 받았다고 알려주는 함수이다.(트랜젝션을 받았고, 트랜젝션의 해쉬를 만들어 이 해쉬를 주는 함수)
'receipt' 는 실제 트랜젝션이 체결되어 블록에 들어가면 주는 함수이다. 따라서 순서는 'transactionHash' 이후 'receipt' 가 나온다.
그런데 이렇게 서명을 하고 TX 를 보내는 것을 따로따로 하는것은 조금 불편하다. caver 에서는 서명과 전송을 한번에 해주는 함수가 있다. 바로 sendTransaction(tx) 이다.
스마트 컨트랙트를 배포한다는 것은 솔리디티 코드를 컴파일해서 나온 2개의 결과물 ABI 와 ByteCode 를 블록체인에 저장하는 것을 말한다. 위 그림에서 data 라는것이 ByteCode 인데 지금은 임의로 적어놓은 그림이다. 보통 이러한 방식보다 트러플이라는 배포전용 툴을 쓰는것이 더 좋다.
Contract() 함수의 첫 매개변수는 abi , 두번째는 컨트랙트 주소가 들어간다.
상태를 바꾸는 함수는 set().send() 를 이용한다.
상태를 바꾸지 않는 함수는 get().call() 을 이용한다.
'BlockChain > 클레이튼' 카테고리의 다른 글
Klaytn 클레이튼 스마트계약과 탈중앙앱 - 블록체인 상태와 트랜젝션 (0) | 2022.06.25 |
---|---|
Klaytn 클레이튼 스마트계약과 탈중앙앱 - 블록체인 기본 (0) | 2022.06.20 |