이전자료
•
웹사이트
•
여기에서 스마트 계약을 작성할 수 있다. (앞으로 컨트랙이라고 명명하겠다.)
•
웹사이트 화면
•
소스코드는 아래와 같다. (디폴트 값이니 지우고 시작하자)
// Klaytn IDE uses solidity 0.4.24, 0.5.6 versions.
pragma solidity >=0.4.24 <=0.5.6;
contract Count {
// Storage variable `count` (type: uint256)
uint256 public count = 0;
// Get current node's block number.
function getBlockNumber() public view returns (uint256) {
return block.number;
}
// Set value of storage variable `count`.
function setCount(uint256 _count) public {
count = _count;
}
}
Go
복사
•
첫 번째 줄이랑 두번째 줄을 보게 된다면 저렇게 solidity의 버전이 >=0.4.24 <=0.5.6 를 따라야 한다는 점을 기억해라
•
3가지의 함수를 작성할 것이다.
•
첫번째는 컨트랙으로 클레이를 송금하는 함수
•
두번째는 컨트랙으로 잔액을 불러오는 함수
•
마지막으로 컨트랙에서 사용자 계정으로 클레이를 보내는 함수
•
일단 아래의 코드를 작성한다.
// Klaytn IDE uses solidity 0.4.24, 0.5.6 versions.
pragma solidity >=0.4.24 <=0.5.6;
contract AdditionGame {
//배포하는 순간 운영자 계좌를 저장할 수 있는 상태 변수 생성
// 생성자를 생성
// 그전에 보통 생성자는 어떤 역할을 할까?
//주로 초기화를 담당한다.
//솔리디티 같은 경우에는 특히 배포할때 가장 먼저 불러오는 것이 생성자이다.
//그이후에는 생성자를 생성하거나 불러올수 없다.
// 이 이점을 활용하여 컨트랙의 소유자 계정을 정할수 있다.
//우선 상태 오우너를 만든다.
address public owner;//타입은 주소형 타입
constructor() public {
owner = msg.sender;//생성자를 만듦 여기에서 msg.sender는 현 컨트랙을 호출하고 있는 사람을 의미한다.
}//owner에 저장해서 블록체인에 영구 반영한다. 이게 초기화 방법
}
Go
복사
•
실행은 아래의 화면을 보면 Auto compile을 체크하고 Start to compile을 누른다.
•
Run을 눌러보면 아래의 창이 나온다.
•
여기는 환경 설정이다.
•
환경 부분 보면 몇개의 옵션이 있는데 dev랑 baobab이 있다. 그외로도 여러개가 있다.
•
dev는 클레이튼 노드가 현재 돌아가고 있는 RPC 주소에 연결해서 테스트 하는 것이다.
•
dev node는 클레이튼에서 제공하는 개발용 노드에 연결해서 테스팅할 수 있는 옵션이다.
•
계정을 랜덤으로 하나 생성하고 100클레이를 미리 받아서 쓸수있게 해준다.
•
그리고 테스팅 하는데 가스 소모가 안들어가게 세팅되어있다.
•
그래서 밑에 Account 부분 보면 이미 100test 클레이가 담아져 있을 것이다.
•
또 바오밥에 연결해서 쓰는 옵션은 정식 테스트에 연결해서 쓰이는 것이다.
•
그리고 바오밥을 선택하는 순간 아래의 계정에 있는 클레이가 0으로 바뀔 것이다.
•
Dev node와 바오밥 노드가 서로 독립적으로 운영되는 노드라서 동일한 계정으로 인식으로 하되
•
노드가 달라서 계정의 상태가 달라지고 밸런스가 바뀌게 된다.
•
Dev Node인 상태로 새로고침 하면 전에 사용했던 계정은 사라지고 새로 생성했던 계정을 다시 보여준다.
•
새로 생성된 계정을 키스토어 파일이나 비밀키로 다운로드받아서 재사용이 가능하다.
•
다른 컴퓨터에서 테스트 할때 기존의 사용했던 계정으로 이어서 할 수 있다.
•
계정 클릭하면 Backup이라는 버튼이 나오고 클릭하면 창이 뜨고 키스토어나 비밀키를 받을수 있는 옵션이 있다.
•
간단하게 비밀키를 백업을 하면 우리가 다시 쓸수있다.
•
또 페이지를 새로 고침하고 계정이 또 생성이 될것이고,
•
이번에는 인풋더 어카운트 옵션을 클릭한다음 개인키 부분에 백업한 비밀키를 붙여 넣고
•
Display label에는 test라고 입력한다.
•
그후 계정을 다시 클릭하면 방금 우리가 실습했던 테스트 계정이 나오게 된다.
•
이런 식으로 웹페이지를 다시 방문하거나 다른 컴퓨터에서 일관성있게 테스트를 진행할 수 있게 해준다.
Deploy
•
compile 버튼 누르고
•
AdditionGame을 배포할수 있는 옵션이 생긴다. 배포를 하게 되면 TX Hash가 나온다. 이게 배포하면서 나오는 해쉬정보이다.
•
contractAddress는 어느 주소에 배포되어있는지 알 수 있도록 한다.
•
그래서 옆에 패널을 보게되면 현 시점에서 어느 주소에 배포되는지 알 수 있다.
•
아래에 owner상태 변수의 값을 불러올수 있는 옵션이 있다.
•
이게 getter 함수인데 우리가 상태변수라고 할수있는 owner를 public으로 설정을 해뒀기 때문에 자동으로 getter 함수를 생성해서 owner 값을 불러올수 있다.
•
call 버튼을 눌러보면 계좌가 하나 뜨는데 이건 바로 컨트랙을 배포하는 사람의 계좌 주소이다.
•
From Account = Owner
실습 1
// Klaytn IDE uses solidity 0.4.24, 0.5.6 versions.
pragma solidity >=0.4.24 <=0.5.6;
contract AdditionGame {
//배포하는 순간 운영자 계좌를 저장할 수 있는 상태 변수 생성
// 생성자를 생성
// 그전에 보통 생성자는 어떤 역할을 할까?
//주로 초기화를 담당한다.
//솔리디티 같은 경우에는 특히 배포할때 가장 먼저 불러오는 것이 생성자이다.
//그이후에는 생성자를 생성하거나 불러올수 없다.
// 이 이점을 활용하여 컨트랙의 소유자 계정을 정할수 있다.
//우선 상태 오우너를 만든다.
address public owner;//타입은 주소형 타입
constructor() public {
owner = msg.sender;//생성자를 만듦 여기에서 msg.sender는 현 컨트랙을 호출하고 있는 사람을 의미한다.
}//owner에 저장해서 블록체인에 영구 반영한다. 이게 초기화 방법
function getBalance() public view returns (uint){
//function 키워드/ 이름은 getBalance / 가시성은 public / 타입은 view로 써서 읽기 전용으로 만든다. 마지막으로 uint 로 리턴하는 방식이다.
return address(this).balance;
//adress this 는 현재 컨트랙 자신을 의미하는 것이다. 즉 additionGame
//맴버로 balance가 접근이 가능하다.
//이렇게 현재 클레이 잔액을 불러올 수 있는 함수가 만들어진다.
//여기까지 작성하고 Deploy 하면 잔액이 0 이 나오는것을 확인할 수 있다.
}
function deposit() public payable{ //여기에서 타입은 payable로 해놓았다.
//계정에서 solidity함수를 쓸려면 payable로 해야지 돈을 받을수 있다.
//유효성 체크
require(msg.sender == owner);
// 리콰이어 코드를 써서 안의 조건이 일치하지 않으면 안되도록 설정
//msg sender는 이 함수를 호출한 계정을 뜻한다.
//그 계정을 상태변수 owner 계정과 비교해서 owner 계정이 아니라면 함수를 실행 못하도록 한다.
}
// 여기 까지 했다면 Deploy를 할때 Deposit 함수가 활성화가 되며 Deposit 함수를 쓸려고 할때 TX Value를 사용해야하는데, deposit 함수에 payable이 붙어있으면 Tx value를 사용해야한다.
// TX value 옆에 Test KLAY가 선택된 상태에서 1이 되도록 하고 deposit 버튼을 클릭한다.
//그러면 트랜잭션이 성공하게 된다.
//From account 계정에서 클레이수가 깎인것을 확인할 수 있다.
// 가스도 깎여야 하는데 DEV Node 모드라서 가스비는 포함하지 않는다.
// getBalance 함수를 누르면 잔액이 얼마인지 확인할 수 있다.
// 1KLAY가 peb로 변환된 값이라서 단위가 조금 바뀔수 있다. 자동변환으로 테스트하게 배려해준다.
// 테스트 단위는 여러가지가 있다. 가장 낮은 단위인 peb로 한다음 보내면 단위가 peb로 보내지는 것이다.
// getBalance를 눌러보면 이전 것과 누적되어서 나오는 것을 확인할 수 있다.
// Gas limit 항목은 auto로 되어있다면, 가스 한도 처리를 자동으로 해두는 것이다.
// Gas limit은 고정이 된것이 아니다. 원래는 25,000으로 고정되어 있는데 단순 송금 한정이다.
// 사용자가 수동으로 가스한도를 정하고 좀더 정확하게 실습을 진행할 수 있다.
function transfer(uint _value) public returns (bool){//인자로 사용자에게 넘길 클레이 값을 uuint _value로 받고 이 값은 Frontend
// 리턴은 bool 값을 리턴한다
require(getBalance() >=_value);// 위에있는 getBalance를 호출해서 현재 컨트랙에 남아있는 잔액을 불러오고 value 값이랑 비교해서 같거나 많으면 통과를한다.
msg.sender.transfer(_value);//즉 정답을 맞춘 사용자가 상금을 타기위해 이 함수를 호출하고 트랜스퍼 밸류는 사용자에게 클레이를 밸류 만큼 트랜스퍼 함수를 사용해서 송금한다.
return true; // 성공 여부를 true로 리턴하게 된다.
}
// Deploy를 하기 위해서 Tx Value를 다시 0으로 초기화 시키고 가스 리밋도 오토로 해주고 Deploy를 하면
// 새로 배포하면서 남은 잔액은 0이 된다.
// TX value에 3 으로 하고 send 하고 다시 TX value 값을 0 으로 맞춰준다음에 transfer 쪽에 Send를 클릭하면 매게변수가 포함된 함수이기에 창이 뜨면서 인자값을 넘기라고 한다.
// 이것도 peb로 변환해서 넘겨야한다 1클레이 정도의 peb를 입력하고 call 버튼을 누르면
// 내잔고에 1Klay가 늘어나고 나의 geBalance에는 2Klay 정도의 peb만 남게 된다.
// Dev Node로 실습했으면 실제로 기록이 남아져 있다. 확인 방법은 AdditionGame 아래에 있는 정보가 Deb Node 남아있는 자료
// 컨트랙 주소만 알고있으면 내가 태스트한 내용을 다시 볼수 있다.
}
Go
복사