4. Remix-Solidity IDE
기존 IDE에서 사용가능한 플러그인 부터 브라우저를 기반으로 별도의 설치가 필요없는 개발 환
경이 나왔다. 그중에서 우리는 별도 설치가 필요없는 브라우저 기반을 사용할 것이다.
* Browser-Solidity(Remix)
Browser-Solidity는 Solidiy 언어 Contributor가 개발한 웹 브라우저 기반 IDE이다.
* Ethereum Studio
리눅스의 이더리움 클라이언트 쉘 접속 가능, cloud9 기반 웹 IDE.
* Intellij-Solidity
인텔리J IDE의 플러그인.
* VS Code Ethereum Solidity Extension
VS code 용 플러그인
* Vim Solidity
구문 강조를 지원하는 Vim 에디터 플러그인.
5. Remix-Solidity IDE
크롬 및 파이어폭스 브라우저를 사용하는 것을 권한다.
Remix 주소는 https://remix.ethereum.org/ 이다.
처음 나오는 ballot.sol 파일이 표시될텐데, 닫아도 상관없다.
6. Smart Contract
우선 왼쪽 메뉴 browser 에 새로운 파일을 만든다. 프로그래밍의 대명사 "helloworld.sol".
그리고 해당 파일에 다음 코드를 작성한다.
pragma solidity ^0.4.8;
contract HelloWorld {
string public greeting;
function HelloWorld(string _greeting){
greeting = _greeting;
}
function setGreeting(string _greeting){
greeting = _greeting;
}
function say() constant returns(string){
return greeting;
}
}
7. Smart Contract
그동안 콘솔(CMD)에서 만들었던 네트워크와 solidity 언어 버전을 설정해야한다.
따라서 1시 방향 "Settings"에 들어간다.
Solidity Version 에서 컴파일 버전을 0.4.8 버전으로 고친다.
8. Smart Contract
이제 Run 탭에 들어가서 Environment 에 들어가서, 우리가 만든 네트워크를 연결한다.
처음에는 Javascript VM 이라고 되어있는데, 이부분을 Web3 Provider로 변경한다.
그러면 alert창이 뜨는데 Ok를 누르면, Web3 Provider Endpoint를 작성하는 부분이 있다.
이제 콘솔을 열어서 실제 Endpoint에 해당하는 localhost를 열어줘야한다.
기존에 geth를 통해서 JSON-RPC에 접속했듯이 작업을 하면 된다.
geth --networkid 4649 --nodiscover --maxpeers 0 --datadir /PATH_TO/
test_data --mine --minerthreads 1 --rpc --rpcaddr "0.0.0.0" --rpcport
8545 --rpccorsdomain "*" --rpcapi
"admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --unlock 0
2>> /PATH_TO/test_data/geth.log
9. Smart Contract
이전과 조금 다른 모양이 나온다. 왜냐하면, 명령어 중에 unlock 0 이라는 부분이 추가되었다.
이 부분은 시작 시, 보안 잠금을 해제한다는 뜻이다. 즉 eth.accounts[0] 의 잠금을 해제한다는
뜻으로 해석하면 된다. 잠금 해제하려면 해당 계정의 비밀번호를 입력하자.
물론 여러개의 계정을 잠금해제하려면, unlock 0,1,2,3 이런식으로 작성해주면 된다.
아무런 오류가 발생하지 않았다면, 다시 Remix로 돌아와서 연결해보자.
오류가 발생하는 경우가 있으니 천천히 진행한다.
10. Smart Contract
잘 연결이 되었다면, 다음과 같은 화면이 표시된다.
Environment 상에서는 Web3 Provider로 연결되어있고, 만들었던 계정들이 보일 것이다.
이제 본격적으로 스마트 계약을 위한 solidity를 공부해보자.
11. Smart Contract
앞서 작성한 코드들을 한 줄씩 살펴보자.
pragma solidity ^0.4.8;
contract HelloWorld {
string public greeting;
function HelloWorld(string _greeting){
greeting = _greeting;
}
function setGreeting(string _greeting){
greeting = _greeting;
}
function say() constant returns(string){
return greeting;
}
}
=> 버전 프라그마
컴파일러의 버전을 지정한다.
12. Smart Contract
앞서 작성한 코드들을 한 줄씩 살펴보자.
pragma solidity ^0.4.8;
contract HelloWorld {
string public greeting;
function HelloWorld(string _greeting){
greeting = _greeting;
}
function setGreeting(string _greeting){
greeting = _greeting;
}
function say() constant returns(string){
return greeting;
}
}
=> 계약 선언
contract로 계약을 선언한다.
(자바의 클래스와 매우 비슷하다.)
13. Smart Contract
앞서 작성한 코드들을 한 줄씩 살펴보자.
pragma solidity ^0.4.8;
contract HelloWorld {
string public greeting;
function HelloWorld(string _greeting){
greeting = _greeting;
}
function setGreeting(string _greeting){
greeting = _greeting;
}
function say() constant returns(string){
return greeting;
}
}
=> 계약 내부에서 유효한 변수를 선언한다.
여기서 public으로 선언 된 부분은,
해당 계약에 접근가능한 모든 사람이 볼 수 있다는
뜻이다. 물론 임의로 변경은 불가능하다.
14. Smart Contract
앞서 작성한 코드들을 한 줄씩 살펴보자.
pragma solidity ^0.4.8;
contract HelloWorld {
string public greeting;
function HelloWorld(string _greeting){
greeting = _greeting;
}
function setGreeting(string _greeting){
greeting = _greeting;
}
function say() constant returns(string){
return greeting;
}
}
=> 생성자
function으로 메서드를 만든다.
보통 생성자는 계약과 같은 이름을 가진 메서드로,
배포할 때만 실행가능한 메서드이다.
여기서 인자로 string 타입의 _greeting을 받는다.
Solidity에서는 관례적으로 메서드의 인수 샆에
언더 바 _ 를 붙인다.
15. Smart Contract
앞서 작성한 코드들을 한 줄씩 살펴보자.
pragma solidity ^0.4.8;
contract HelloWorld {
string public greeting;
function HelloWorld(string _greeting){
greeting = _greeting;
}
function setGreeting(string _greeting){
greeting = _greeting;
}
function say() constant returns(string){
return greeting;
}
}
=> 메서드 선언
반환값을 돌려주는 메서드를 선언 할 수 있다.
반환값을 돌려주는 경우 returns의 괄호 안에
반환값의 데이터 형을 선언한다.
여기서 블록체인에 저장된 데이터의 변경을
수반하지 않는 경우 constant를 붙인다.
21. Smart Contract
기
방금 복사한 주소를 At Address에 추가하고,
At Address를 클릭해보자.
방금 우리가 만든 계약에 대한 블록이 나온다.
앞서 했던 greeting과 say를 클릭해서
동일한 내용이 나오는지 확인해보자.
22. Smart Contract
Remix를 통해 계약을 만들고 실행도 해보았다. 이번에는 기존에 작성한 계약에 대해
geth에서도 확인해보자.
기존 계약에 접근하기 위해서는
ABI와 계약주소가 필요하다.
* ABI(Application Binary Interface)
계약의 외부 사양을 말한다. 계약에 포함되는 메
서드와 인수, 반환값에 대한 정보로 계약에 접근
할 때 필요한 정보 중 하나다.
따라서 빨간 상자의 저장 버튼을 클릭하자.
새로운 scenario.json 파일이 생긴다.
23. Smart Contract
방금 새로 추가한 son 파일을 열어 맨 밑으로 내리면. "abis"라는 key로 데이터가 있다.
해당 부분을 복사하자.
새로 터미널을 열어 JSON-RPC 서버에 접속하자.
[{"constant": false,"inputs": [{"name": "_greeting","type": "string"}],"name":
"setGreeting","outputs":
[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"inputs":
[{"name": "_greeting","type": "string"}],"payable": false,"type":
"constructor","stateMutability":"nonpayable"},{"constant": true,"inputs":
[],"name": "greeting","outputs": [{"name":
"","type":"string"}],"payable":false,"type":"function","stateMutability":"view"},
{"constant":true,"inputs": [],"name": "say","outputs": [{"name": "","type":
"string"}],"payable": false,"type": "function","stateMutability": "view"}]
geth attach rpc:http://localhost:8545
24. Smart Contract
새로운 터미널에서 JSON-RPC 서버에 접속 한뒤,
방금 복사해온 abi 정보를 abi 변수에 담아 string으로 저장하자.
> abi = '[{"constant": false,"inputs": [{"name": "_greeting","type": "string"}],"name":
"setGreeting","outputs":
[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"inputs":
[{"name": "_greeting","type": "string"}],"payable": false,"type":
"constructor","stateMutability":"nonpayable"},{"constant": true,"inputs": [],"name":
"greeting","outputs": [{"name":
"","type":"string"}],"payable":false,"type":"function","stateMutability":"view"},
{"constant":true,"inputs": [],"name": "say","outputs": [{"name": "","type":
"string"}],"payable": false,"type": "function","stateMutability": "view"}]'
25. 그리고 방금 Transaction을 해서 생성된 계약주소 또한 변수에 담아두자.
> add_contract = "9fds98rj3v89cx8z09sd98qdasda"
이제 기존 계약에 접근하기 위한, 모든 준비가 끝이 났다.
> contract = eth.contract(JSON.parse(abi)).at(add_contract)
> contract.say.call()
"Hello World!"
Smart Contract
* 여기서 call()은 블록체인에서 데이터를 얻을 때 사용된다. 블록을 생성하지 않아도 되기 때문
에 수수료는 발생하지 않는다.
26. 기존계약에 접근을 했다면, 터미널에서도 계약을 진행할 수 있다는 뜻이다.
계약 객체.메서드.sendTransaction(인수, {from: 보내는 주소, gas:가스양})
블록체인은 상태를 변화시키기 위해 사용한다. 여기서 '상태를 변화시킨다’라는 뜻은 새롭게 데
이터를 쓰거나 기존의 데이터를 변경하는 것을 말한다.
이더리움에서는 수수료(Gas)가 발생한다.
Smart Contract
28. Solidity를 좀 더 쉽게 배울 수 있다.
본인은 공식 문서 및 구글링을 통해서 Solidity를 공부했다. ERC-20 토큰 개발을 위해 공부했지
만, 막상 공부하기에는 쉽지는 않다.
그나마 레퍼런스가 타 언어에 비해 많은 편이기 때문에 공부하기에는 엄청 어렵지는 않지만,
구조적으로 조금 복잡한 감이 어느정도 있다. 따라서 다음 사이트에서 조금 더 배우기 쉽고
일부 코스는 한글로 되어있어 좀 더 배우기 쉬울 것 이다.
Solidity Study
https://cryptozombies.io/ko/course
29. 이더리움 관련 레퍼런스를 찾던 중, 코드카데미 사이트 처럼 실시간 디버깅으로 스스로 공부할
수 있게 해두었다. 레슨 4까지는 한글로 되어있긴하지만, 그 이후에는 아직 번역이 완벽하게 되
어있지 않다. 기초적인 공부하기에는 충분하니, 적극적으로 이용하면 된다.
Solidity Study
레슨이 끝날 때 마다 크립토좀비가 업그레이드(?)된다.
업그레이드 하는 재미도 있고 Solidity도 공부할 수 있으니
이용하면 좋을 듯 하다.