블록체인 세미나 1차 정리
📋 목차
- 스마트 컨트랙트 작성
- 스마트 컨트랙트 배포
- 스마트 컨트랙트 호출 및 실행
🚀 세미나 중 나왔던 개념 정리
PoA(Proof of Authority, 권위증명) 방식
- 이더만 해당
- 해쉬값을 찾아내서 블록을 찾아내는 방식
- 그것으로 인해 이더를 호출받는 방식
Pow(Proof of Work, 작업증명) 방식
- 검증자들이 어카운트를 지정하고 계좌가 인증하는 방식
- 가나슈가 여기에 해당
Counter.sol
pragma solidity ^0.8.10;
contract Counter {
uint public count;
// Function to get the current count
function get() public view returns (uint) {
return count;
}
// Function to increment count by 1
function inc() public {
count += 1;
}
// Function to decrement count by 1
function dec() public {
// This function will fail if count = 0
count -= 1;
}
}
'view'가 들어간 함수와 아닌 함수를 볼 수 있는데,
view는 컨트랙트 생성 비용이 안든다! 하지만 단순 조회만 가능하다.
(즉 정보 수정이 불가능함)
그외의 하지만 다른 것들을 하려면 트랜잭션을 생성(비용 발생)해야 함
Web3로 작성한 js파일은 컨트랙트를 호출해서 실행하는 역할임
🚀 작업 순서
https://www.notion.so/chuljin/3795a875cdae4a7d954dc892755beafc#f977c9aec8a542f28ee473032a011353
1. node js 설치(버전 16.15.0)
2. 파이썬 설치(버전 3.10)
3. 비쥬얼스튜디오 설치(vscode는 원래 설치되어있으므로...)
4. 트러플 설치
5. 가나슈 설치
6. 솔리디티 설치
7. 컴파일 (작성한 솔리디티를 바이트코드로 변환하는 작업)
8. 가나슈와 연결하여 작성한 컨트랙트 배포하기
9. 컨트랙트 호출하여 실행하기
차장님이 주신 truffle.zip 파일을 설치하면
해당 파일은 build가 안되어있다.
일단 vscode의 터미널창을 켜서 cmd모드로 전환시켜준 다음
📌 트러플 설치
npm install truffle -g
정상적으로 설치되었는지 확인하려면, 트러플 버전 확인
$ truffle version
Truffle v5.5.21 (core: 5.5.21)
Ganache v7.2.0
Solidity - 0.8.15 (solc-js)
Node v16.15.0
Web3.js v1.7.4
위와 같이 트러플 버전만 물어봤는데 5개의 정보를 전부 알려줌
solidity 컴파일러의 버전을 맞추려면
프로젝트 내부에 있는 truffle-config.js 파일에서 컴파일러 부분을 수정해야 한다.
// Configure your compilers
compilers: {
solc: {
version: "0.8.15", // Fetch exact version from solc-bin (default: truffle's version)
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
// settings: { // See the solidity docs for advice about optimization and evmVersion
// optimizer: {
// enabled: false,
// runs: 200
// },
// evmVersion: "byzantium"
// }
}
},
📌 트러플 초기 세팅
npm truffle init
📌 트러플과 가나슈 연동
먼저 가나슈에 들어가서 컨트랙트 탭으로 이동하여
Link truffle projects를 클릭하여
위와 같이 저장해준다.
저장 후 리프레시가 되었다면 메인탭의 리모닉은 복사해서
프로젝트 폴더의 truffle-config.js 파일의 프로바이더 부분을 수정한다.
const HDWalletProvider = require('@truffle/hdwallet-provider');
//
// const fs = require('fs');
const mnemonic = "{가나슈의 리모닉 붙여넣기}";
프로바이더를 명시해주는 이유?
나는 가나슈 네트워크에 연결할거야. 라는 어떤 명시를 하기 위해서 명시하는 것,
얘로 인해 롭스턴 네트워크에도 연결할 수 있고 핑거 프라이빗 네트워크에도 연결할 수 있다.
또한 파일 하단의 네트워크 정보를 가나슈 서버 정보로 변경한다.
networks: {
// Useful for testing. The `development` name is special - truffle uses it by default
// if it's defined here and no other network is specified at the command line.
// You should run a client (like ganache, geth, or parity) in a separate terminal
// tab if you use this network and you must also set the `host`, `port` and `network_id`
// options below to some value.
//
development: {
provider: () => new HDWalletProvider(mnemonic, "http://127.0.0.1:7545"),
host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
📌트러플 빌드(컴파일)
truffle bulid
처음에 여기서 hdwallet-provider 가 없다는 오류가 계속 나타나서
npm install @truffle/hdwallet-provider
를 하여 설치해주었다.
아무튼간, compile 명령어를 날려주면 contracts 디렉토리 안에 있는 솔리디티로 작성한 모든 파일이 컴파일된다.
build 디렉토리가 생성되었고, 그 안에 Counter.json과 Migrations.json 파일이 생성됨을 확인 할 수 있을 것이다.
C:\Users\****\Downloads\truffle>truffle bulid
> The build command is planned for deprecation in version 6 of Truffle.
> See https://github.com/trufflesuite/truffle/issues/3226 for more information.
No build configuration found. Preparing to compile contracts.
Compiling your contracts...
===========================
> Compiling .\contracts\Counter.sol
> Compiling .\contracts\Migrations.sol
> Compilation warnings encountered:
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/contracts/Counter.sol
> Artifacts written to C:\Users\jinkyung\Downloads\truffle\build\contracts
> Compiled successfully using:
- solc: 0.8.15+commit.e14f2714.Emscripten.clang
이렇게 json 파일들이 생성된 것을 볼 수 있는데, ABI에 대한 정보를 각각 담고있다.
Application Binary Interface
컨트랙트의 함수와 매개변수들을 JSON 형식으로 나타낸 리스트다.
ABI는 컨트랙트 내의 함수를 호출하거나 컨트랙트로부터 데이터를 얻는 방법이다.
이더리움 스마트 컨트랙트는 이더리움 블록체인에 배포된 바이트코드다.
컨트랙트 내에 여러 개의 함수가 있을 수 있을 것이다.
ABI는 컨트랙트 내의 어떤 함수를 호출할지를 지정하는데 필요하며,
우리가 생각했던 대로 함수가 데이터를 리턴한다는 것을 보장하기 위해 반드시 필요하다.
ABI에 대한 자세한 정보
📌 컨트랙트 배포하기
truffle init을 했을 때, migrations 디렉토리가 생성되었다.
거기 안에 1_initial_migration.js 파일이 있을 것이다.
우리는 Counter.sol 파일에 대한 배포 파일을 만들어야하기에 migrations 디렉토리 안에
2_initial_counter 파일을 하나 추가해준다.
(이름을 저렇게 명칭하는건 일종의 약속이다.)
그리고 터미널에 아래 명령어를 날려주면 된다.
truffle deploy
Compiling your contracts...
===========================
> Compiling .\contracts\Counter.sol
> Compiling .\contracts\Migrations.sol
> Compilation warnings encountered:
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/contracts/Counter.sol
> Artifacts written to C:\Users\jinkyung\Downloads\truffle\build\contracts
> Compiled successfully using:
- solc: 0.8.15+commit.e14f2714.Emscripten.clang
Starting migrations...
======================
> Network name: 'development'
> Network id: 5777
> Block gas limit: 6721975 (0x6691b7)
1_initial_migration.js
======================
Replacing 'Migrations'
----------------------
> transaction hash: 0xff3aaf8fad01a4f05f50ac11bc81418013b15cda00437d5eef797c6b180c523e
> Blocks: 0 Seconds: 0
> contract address: 0xEf636D62151bDE4354e078CAC771ab12dDa0A039
> block number: 1
> block timestamp: 1657867913
> account: 0x1f4e6877b55dBd7D09c01adB9BB95E4684102290
> balance: 99.99502292
> gas used: 248854 (0x3cc16)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00497708 ETH
Replacing 'Counter'
-------------------
> transaction hash: 0xb7b54026cf420f59fcb55ea59ee8e01fc619f20e29a4678879b274a402a4acb2
> Blocks: 0 Seconds: 0
> contract address: 0x3BeBd80B408E3F183C6fDd33fb393296C1b2da5e
> block number: 2
> block timestamp: 1657867914
> account: 0x1f4e6877b55dBd7D09c01adB9BB95E4684102290
> balance: 99.99171762
> gas used: 165265 (0x28591)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.0033053 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00828238 ETH
2_initial_counter.js
====================
Replacing 'Counter'
-------------------
> transaction hash: 0xce1cfa49d354a50ed209a6621fd63c036beed64a8741cd73fe3c7a63d973478f
> Blocks: 0 Seconds: 0
> contract address: 0xf2883BFF7cd9903897433151C4aB6d0bE55E0cae
> block number: 4
> block timestamp: 1657867915
> account: 0x1f4e6877b55dBd7D09c01adB9BB95E4684102290
> balance: 99.98756206
> gas used: 165265 (0x28591)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.0033053 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.0033053 ETH
Summary
=======
> Total deployments: 3
> Final cost: 0.01158768 ETH
배포과정을 보니 compile를 먼저 하고 migrations 처리되는 것을 볼 수 있다.
migrations 폴더안에 있는 배포 JS파일을 모두 배포대상으로 하며
각 배포 JS별로 트랜젝션 hash와 block number (블록 생성 개수) 그리고
gas 비용까지 잘 보여준다.
이 정보는 가나슈에서도 확인이 가능하다.
해당 계정에 트랜잭션 카운트가 5개가 쌓인 것을 볼 수있고,
컨트랙트 탭으로 옮겨가면
내가 배포한 컨트랙트 함수명이 그대로 나타난 것을 볼 수 있다.
(컨트랙트 배포가 잘 완료되었다는 얘기)
address는 해당 컨트랙트 주소,
creation tx는 tx hash(id)스토리지는 저장된 정보?등등의 각 트랜잭션의 정보를 확인할 수 있다.
"networks": {
"5777": {
"events": {},
"links": {},
"address": "0xf2883BFF7cd9903897433151C4aB6d0bE55E0cae",
"transactionHash": "0xce1cfa49d354a50ed209a6621fd63c036beed64a8741cd73fe3c7a63d973478f"
}
},
정상적으로 잘 배포된 것을 볼 수 있다.
제일 위의 트랜잭션을 클릭해보면,
컨트랙을 날린 주소(계정), 해당 트랜잭션이 저장된 컨트랙트 주소
가스 소요량, 가스비, 가스 한도, 블록의 몇번째에 위치해 있는지,
또 TX DATA, 해당 트랜잭션에 담겨져 있는 정보를 확인할 수 있다.
(정보는 바이트코드로 표기되어있다, 재현님 말씀으로는 앞 6글자는 주소 정보? 라는데 제대로 못 들었음...)