[TIL] 2023-06-12 DAY55
GIT 주소 : https://github.com/dowoo303/SOLIDITY
오늘 배운것들
- 저번 시간 복습
1) 터미널에서 컨트랙트와 소통
2) remix+vs code에서 컨트랙트와 소통- event_emit
1) 1번 터미널에서는 거래를 일으키고, 2번 터미널에서는 web socket이용해서 events결과값 받아보기
각종 팁
web3.setProvider('새로운 api키')를 이용하면 api 변경 가능하다.- 가끔 github랑 npmjs.com 내 코드랑 다를 때가 있다.
- 가스비가 들지않는 함수는 call()
회고
- 목요일날 이론 TEST2 칠 예정
2.node 파일명.js에 터미널 코드 몰아넣고 실행시키면 한번에 가능해진다.(다만, 프라이빗 코드와 api키가 그대로 공개되기 때문에 좋은 방법은 아님)- 남의 컨트랙트 주소와 ABI만 알고 있으면 컨트랙트 내 함수를 내가 마음대로 실행이 가능하다.
다양한 종류 노드 존재 3개 예시
풀노드
우리에게 가장 가까운 노드
처음 노드에 연결할때 과정과 이름
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)
-> 컨트랙트 주소와 abi키 가져와서 터미널에 변수로 입력
c_address = "0xD0b9194F68bBf00C201176709d48dea09238fFF0"
let abi =
-> 컨트랙트화
let contract = new web3.eth.Contract(abi, c_address)
-> 컨트랙트 내 함수 이름 확인 후 동작시켜보기
contract.methods
contract2.methods.myAddress().call().then(console.log)
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
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)})})
로그 생성 가능(편하게 필터링이 가능하짐)
-> 특정 이벤트 값 받아오기 가능
-> 특정 이벤트 값이 내가 원하는 값이 나올때 까지도 가능
pure나 view에서는 event_emit이 불가능
형태: event 이름(변수 ..) 함수 안에서: emit 이름(변수..)
```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);
}
}