[TIL] Part2 - DAY55 Solidity - 컨트랙트 소통, event_emit

박동우·2023년 6월 12일

블록체인 스쿨 3기

목록 보기
51/72

[TIL] 2023-06-12 DAY55


Solidity

GIT 주소 : https://github.com/dowoo303/SOLIDITY


오늘 배운것들

  1. 저번 시간 복습
    1) 터미널에서 컨트랙트와 소통
    2) remix+vs code에서 컨트랙트와 소통
  2. event_emit
    1) 1번 터미널에서는 거래를 일으키고, 2번 터미널에서는 web socket이용해서 events결과값 받아보기

각종 팁

  1. web3.setProvider('새로운 api키') 를 이용하면 api 변경 가능하다.
  2. 가끔 github랑 npmjs.com 내 코드랑 다를 때가 있다.
  3. 가스비가 들지않는 함수는 call()

회고

  1. 목요일날 이론 TEST2 칠 예정
    2.node 파일명.js에 터미널 코드 몰아넣고 실행시키면 한번에 가능해진다.(다만, 프라이빗 코드와 api키가 그대로 공개되기 때문에 좋은 방법은 아님)
  2. 남의 컨트랙트 주소와 ABI만 알고 있으면 컨트랙트 내 함수를 내가 마음대로 실행이 가능하다.



📕 이론 TEST2

  1. 다양한 종류 노드 존재 3개 예시
    풀노드
    우리에게 가장 가까운 노드

  2. 처음 노드에 연결할때 과정과 이름

  1. SPV노드와 풀노드의 차이점
    위에서 언급한 차이점으로 인한 특징과 장점
  1. SPV노드와 풀노드가 거래를 검증하는 과정
  1. SPV노드의 약자와 의미하는 바
  1. 머클루트와 path
  1. 풀노드가 되고 싶은 신입노드 과정
    정보 주고받는 과정
  1. 특정 집단에 속하면 어떤 이득?
    마이닝 툴
  1. 그 집단에 들어가는 이유?
    마이닝툴에 들어가면 안정적인 수익이 가능하기떄문
  1. 비트코인과 이더리움의 헤더의 공통적 요소
  1. key-value쌍 머클루트 작성
  1. 그림한장 줌 -> 머클 패트리시아 트라이
  1. 블록에 포함되는 3가지
  1. 상황에 맞게 어떤 트라이를 사용해야하는지
  1. 이더리움의 블록용량이 어떻게 결정?
  1. 가스비는 두가지가 혼용되어 있음 설명
    가스비를 높게 설정하면 빨라지는가?
    왜 그런가?
  1. 현재 일으키는 거래가 70인데 110으로 설정하면 최소 수수료
  1. 가스 limit이 충분치 않다면?
  1. 이더리움에서는
  1. 계정 두가지 CA EOA
  1. 총 4가지 경우 EOA
  1. 이더리움 지갑 생성과정 4단계



💻 Solidity 코딩

✅ 터미널 스마트 컨트랙트 작동 복습

var {Web3} = require('web3')
var web3 = new Web3('https://goerli.infura.io/v3/apikey')

const privateKey = '0x개인키'
const account = web3.eth.accounts.privateKeyToAccount(privateKey)

account // 계정 정보 잘 나오는지 확인
web3.eth.accounts.wallet.add(account) // 해당 환경에 지갑 정보 추가

var account2 = '돈 받을 지갑주소'
web3.eth.sendTransaction({from : account.address, to : account2, gas : "21000", value : "10000000000000000"})

web3.eth.defaultAccount
web3.eth.defaultAccount = account.address

web3.eth.sendTransaction({to : account2, gas : "21000", value : "10000000000000000"}).then(console.log)

✅ 리믹스에서 코드 입력후 메타마스크를 통해서 goerli 네트워크에 배포 후 컨트랙트의 함수 동작시켜보기

-> 컨트랙트 주소와 abi키 가져와서 터미널에 변수로 입력
c_address = "0xD0b9194F68bBf00C201176709d48dea09238fFF0"
let abi =
-> 컨트랙트화
let contract = new web3.eth.Contract(abi, c_address)
-> 컨트랙트 내 함수 이름 확인 후 동작시켜보기
contract.methods
contract2.methods.myAddress().call().then(console.log)


✅ vs code

history

1 cd .\Desktop\
2 cd .\Truffle_LikeLion\
3 cd 0612
4 truffle init
5 truffle create contract A

마이그레이션 파일 생성(이름에 번호 붙이는거 잊지말기)
truffle-config 설정
.env 생성
npm install dotenv
npm install @truffle/hdwallet-provider

truffle compile
truffle migrate --network goerli
truffle console --network goerli

✅ send

var {Web3} = require('web3')
var web3 = new Web3('INFURA_API_KEY')

var privateKey = 'YOUR PRIVATE KEY'
var account = web3.eth.accounts.privateKeyToAccount(privateKey)

web3.eth.accounts.wallet.add(account)
web3.eth.defaultAccount = account.address

var abi = /*[CONTRACT ABI 여기에 넣기]*/
var c_address = 'CONTRACT ADDRESS 여기에 넣기'
var contract = new web3.eth.Contract(abi, c_addr)

contract.methods.a().call().then(console.log)

var tx = {from : account.address, to : c_address , gas : 300000, gasPrice : 3000000, data : contract.methods.함수이름(input 값).encodeABI()}
var signPromise = web3.eth.accounts.signTransaction(tx, account.privateKey)

signPromise.then((signedTx)=> {var sentTx = web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction); sentTx.on("receipt", receipt=> {console.log(receipt)})})

✅ event_emit

로그 생성 가능(편하게 필터링이 가능하짐)
-> 특정 이벤트 값 받아오기 가능
-> 특정 이벤트 값이 내가 원하는 값이 나올때 까지도 가능
pure나 view에서는 event_emit이 불가능
형태: event 이름(변수 ..) 함수 안에서: emit 이름(변수..)

event subscribe

```jsx
// Terminal 1번
var {Web3} = require('web3')
var web3 = new Web3('https://goerli.infura.io/v3/apikey')

var privateKey = '개인키'
var account = web3.eth.accounts.privateKeyToAccount(privateKey)

web3.eth.accounts.wallet.add(account)
web3.eth.defaultAccount = account.address

var c_addr = '주소'
var abi = 컨트랙트 abi
 
var contract = new web3.eth.Contract(abi, c_addr)

contract.methods.a().call().then(console.log)

// send()가 안되서 미리 서명을 하고 보내는 방식 사용
var tx = {from : account.address, to : c_addr, gas : 300000, gasPrice : 30000000, data : contract.methods.setA(10000).encodeABI()}
var signPromise = web3.eth.accounts.signTransaction(tx, account.privateKey)

signPromise.then((signedTx)=> {var sentTx = web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction); sentTx.on("receipt", receipt=> {console.log(receipt)})})

// Terminal 2번
var {Web3} = require('web3')
var web3 = new Web3('wss://mainnet.infura.io/ws/v3/apikey')

var privateKey = '개인키'
var account = web3.eth.accounts.privateKeyToAccount(privateKey)

web3.eth.accounts.wallet.add(account)
web3.eth.defaultAccount = account.address

var c_addr = '주소'
var abi = 컨트랙트 abi
 
var contract = new web3.eth.Contract(abi, c_addr)

contract.events.ADD(()=>{}).on('data', function(event) {console.log(event);})
contract.events.DIV(()=>{}).on('data', function(event) {console.log(event.returnValues);})
contract.events.SUB(()=>{}).on('data', function(event) {console.log(event.returnValues[1]);})
contract.events.MUL(()=>{}).on('data', function(event) {if(event.returnValues[1]>=100) {console.log("higher than 100")}})



🟥 코드

contract EVENT_EMIT {
    event ADD(string add, uint result);
    event SUB(string sub, uint result);
    event MUL(string mul, uint result);
    event DIV(string div, uint result);

    function add (uint _a, uint _b) public returns(uint _c) {
        _c = _a + _b;
        emit ADD("Plus", _c);
    }

    function sub(uint _a, uint _b) public returns(uint _c) {
        _c = _a - _b;
        emit SUB("Minus", _c);
    }

    function mul(uint _a, uint _b) public returns(uint _c) {
        _c = _a * _b;
        emit MUL("Times", _c);
    }

    function div(uint _a, uint _b) public returns(uint _c) {
        _c = _a / _b;
        emit DIV("Divided", _c);
    }
}

profile
HELLO!

0개의 댓글