일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Greeter
- jenv
- lambda
- docker
- RDD
- HelloWorld
- 블록체인
- OpenCV
- Apache Spark
- apache-spark
- python3
- stopwords
- BlockChain
- MAP
- macbook
- web3
- word count
- nodejs
- bigdata
- 이더리움
- remix
- solidity
- node
- geth
- Ethereum
- Spark
- web3@1.2.8
- pyspark
- Histogram
- Python
- Today
- Total
이것저것 프로그래밍 정리(Macbook)
Ethereum으로 프로그래밍 - Counter(web3@1.2.8) 본문
이번 글에서는 web3@1.2.8, solidity@0.5.0, node@13.8.0 을 이용해서 Counter(계수기)를 만들어 보도록 하자.
1. 스마트 컨트랙 개발
간단히 숫자를 더해주는 add() 와 빼주는 subtract() 함수와 현재의 숫자를 보여주는 getCounter() 함수를 구현해 주도록 하자.
2. 컴파일
1단계의 스마트 컨트랙을 컴파일 하여 abi와 byte code를 얻어오도록 하자.
solc 컴파일러를 통해 얻어올수도 있지만, 에러가 더 많이 나는 관계로 REMIX를 통해서 solidity 0.5.0 버전을통해 컴파일해서 abi 와 byte code를 얻어오도록 하겠다.
Compile Counter.sol을 누른 후 Compliation Details를 누르면 다음과 같은 화면이 뜬다.
BYTECODE 항목에서 "objects"에 해당하는 컴파일 결과 필요한 byte code에 해당한다.
WEB3DEPLOY에서 첫번채 줄에서 web3.eth.contract([{"constant..."}]) 에서 contract 안에 json 형식으로 있는 것이 abi 에 해당한다.
컴파일 해서 얻은 abi 와 bytecode를 js 파일로 저장해두도록 하자.
3. smart contract 배포
컴파일 해서 얻은 abi 와 byte code를 갖고 배포해보자.
먼저 web3의 객체를 생성해주도록 하자.
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8445"));
그 다음 abi 와 byte code를 선언해 주도록 하자.
var abi = [{"constant":false,"inputs":[],"name":"add","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"subtract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}];
var _bin = "60806040526000805534801561001457600080fd5b50610104806100246000396000f3fe6080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634f2be91f1460585780636deebae314606c5780638ada066e146080575b600080fd5b348015606357600080fd5b50606a60a8565b005b348015607757600080fd5b50607e60bb565b005b348015608b57600080fd5b50609260cf565b6040518082815260200191505060405180910390f35b6000808154809291906001019190505550565b600080815480929190600190039190505550565b6000805490509056fea165627a7a7230582065906120a250e322a21b5ec9f50b36da7a685e764f1adc780a9db108aec41b430029";
이후 abi를 사용해서 smart contract의 객체를 생성해 주도록 하자.(web3@1.2.8 사용)
var counterContract = new web3.eth.Contract(abi);
그러고 나서 생성된 smart contract의 객체를 byte code를 사용해서 블록체인 네트워크 상에 배포해 주도록 하자.(web3@1.2.8 사용)
counterContract.deploy({data:"0x" + _bin}).send({from:"0x36ea6a51fc997afdd9371fbd056a001d2a1c6f98", gas: 364124, gasPrice:'1000000000'}).then(function(newContractInstance){console.log(newContractInstance.options.address)});
이것을 하나의 .js 파일로 합치고 실행해보도록 하자.
위 항목들을 하나의 Counter_Deploy.js 파일로 작성하고 다음 명령어를 통해 실행해 주도록 하자.
!node src/Counter_Deploy.js
위명령어 실행시 다음과 같은 오류가 뜰수도 있다.
(node:19537) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Returned error: authentication needed: password or unlock (node:19537) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
다음과 같은 오류는 account가 잠겨 있는 것이니, geth 창, 혹은 node 창에서 account를 잠금해제 해 주도록 하자.
geth 창에서는 다음과 같이 잠금 해제를 하면 된다.
personal.unlockAccount(eth.accounts[0],"1234");
"1234" 대신 자신의 비밀번호를 넣어주면 된다.
이번에는 node 창에서 account를 잠금 해제 하는 법을 알아보도록 하자.
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8445"));
먼저 위처럼 web3 객체를 생성해 주도록 하자.
web3.eth.personal.unlockAccount("0x36ea6a51fc997afdd9371fbd056a001d2a1c6f98","1234");
이후 다음과 같이 잠금해제를 해 주도록 하자. 앞에는 자신의 coinbase를 직접 입력 해주면 되고, 뒤에는 password를 입력해 주면 된다.
이제 다시 smart contract를 배포하는 과정으로 돌아가 보도록 하자.
계정을 잠금 해제한 이후에 다시 Counter_Deploy.js 파일을 실행해 보자.
그럼 옆에 *표가 떠있는 것을 확인할수 있다.
이후 geth 창에서 pending 되어 있는 transaction을 확인하고 mining을 해서 배포를 마무리 해보도록 하자.
eth.pendingTransactions 를 통해 pending 되어 있는 Transaction을 mining을 통해 배포를 마무리 한것이다.
배포가 끝나면 배포된 contract의 주소를 확인 할 수 있다.
4. 사용하기
먼저 위에서와 같이 web3의 객체를 생성해주도록 하자.
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8445"));
이후 abi 와 위에서 얻은 contract의 주소를 명시해 주도록 하자.
var abi = [{"constant":false,"inputs":[],"name":"add","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"subtract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}];
var addr = "0xB1377A814eC567A63A49154f69960636FDBfF4e9";
그러고 나서 abi 와 addr을 이용해서 블록체인에 생성되어 있는 객체를 얻어오도록 하자.
var counter = new web3.eth.Contract(abi,addr);
이제 위에 것들을 이용해서 node 창에서 counter 컨트랙을 이용하면 된다.
그 전에 위에 항목들과 node 창에서 쓸 내용들을 .js 파일로 저장해 놓도록 하자.
이제 실제로 node 창에서 어떻게 실행하는지 봐 보도록 하자.
counter 객체를 생성했으니 그 안의 함수들을 사용해보자.
counter 안에 add, subtract, getCounter 를 사용해 보자.
먼저 getCounter로 현재의 저장되어 있는 수를 확인해보자.
getCounter는 call 함수이기 때문에 mining 없이 결과값을 확인 할 수 있다.
counter.methods.getCounter().call().then(function(value){console.log(value);});
현재 숫자가 0 인것을 확인 할수 있다.
이제 add() 함수를 통해 숫자를 1 증가 시켜주도록 하자.
.send() 안에 from에는 coinbase의 계정을 직접 써주면 된다.
add() 함수는 send 함수이기 때문에 geth 창에서 마이닝이 필요하다.
이후 geth창으로 이동하여 현재 pending 되어 있는 transaction을 확인 후 mining을 해주도록 하자.
다시 node 창으로 넘어와서 1이 증가되었는지 확인해보자.
1이 증가 된것을 확인 할수 있다.
이번에는 똑같이 subtract 함수를 사용해보도록 하자.
.send() 안에 from에는 coinbase의 계정을 직접 써주면 된다.
subtract() 함수는 send 함수이기 때문에 geth 창에서 마이닝이 필요하다.
이후 geth창으로 이동하여 현재 pending 되어 있는 transaction을 확인 후 mining을 해주도록 하자.
다시 node 창으로 넘어와서 1이 감소하여 0이 되었는지 확인해보도록 하자.
1이 감소해서 다시 0이 된것을 확인 할 수 있다.
다음 글에서는 계정간에 송금을 하는 방법을 알아보도록 하자.
'ethereum(blockchain)' 카테고리의 다른 글
Ethereum으로 프로그래밍 - Greeter(web3@1.2.8) (0) | 2020.05.30 |
---|---|
Ethereum으로 프로그래밍 - HelloWorld (web3@1.2.8) (0) | 2020.05.30 |
Ethereum으로 프로그래밍 - Greeter(web3@0.2.0) (0) | 2020.05.19 |
Ethereum으로 프로그래밍 - HelloWorld (web3@0.2.0) (0) | 2020.03.16 |
Ethereum으로 프로그래밍 - ethereum 네트워크, 사설망 구성해보기 (0) | 2020.03.05 |