TIL53

shnae·2024년 1월 11일
0
post-thumbnail

Do you need a Blockchain?

  • writer 채굴자

  • reader 블록체인을 읽거나 분석하는 사람들 (ex. cryptoquant)

  • permissionless blockchain - 쉽게 들어오고 떠날 수 있는 체인

  • permissioned blockchain - 접근 권한을 제한할 수 있는 체인

  • ttp 가 있다면 블록체인 필요없음 → 책임을 참여자들과 분산시키는 것이 전제인데, 그게 없다면 블록체인은 필요없다

  • DPoS

  • 모든 writer들이 알려졌다?

  • Are all writers trusted? - 항상 믿을만한 행동을 할까? 믿을 수 있다면 블록체인이 필요없다.

다 알려지고, 믿을 수 있는 writer들이 있고. 다양한 DB가 있고. 그렇다면 블록체인이 필요없다.

→ 결국 신뢰할 수 없는 상황에 사용하는 것.

distribute → balanceOf { return 1000; } → 실질적으로 전송할 수 있는 가치가 아닌 경우임 (”장난질”)

→ 기업들이 코드를 공개하는 이유는 이러한 상황에 대해 유저들을 안심시켜주기 위해.


web3 를 배우는 이유

  • 인터넷 접속 없이, 이더스캔 없이 이더리움 정보에 접근하기 위해.
  • package와 함께 사용할 프로바이더가 필요하다
var {Web3} = require('web3');
var web3 = new Web3('https://cloudflare-eth.com');
web3
  • 프로바이더 확인: web3.provider
  • cryptography 패키지 사용함
web3.eth.getBlockNumber().then(console.log)
await web3.eth.getBlockNumber()
// block 정보 조회하기
web3.eth.getBlock(12345678).then(console.log)
// 지갑 주소 조회하기
web3.eth.getBalance('0x9228624C3185FCBcf24c1c9dB76D8Bef5f5DAd64').then(console.log)
// 12345678 블록의 두번째 거래 해시번호 (1)
web3.eth.getTransactionFromBlock(12345678, 1).then(console.log)
// 계정 생성
web3.eth.accounts.create()
// 프라이빗키
var privateKey = '0x011111111111';
// 프라이빗키로 계정생성 - 이미 생성되어 있는 계정주소로 가져오게 된다
var account = web3.eth.privateKeyToAccount(privateKey);
  • 가스비: 21000 (베이스)
web3.eth.defaultAccount = account.address
web3.eth.sendTransaction({to: account2, gas:"21000", value:"10000000000000000"}).then(console.log)

불편하면 불편해질수록 자유도는 올라간다고 생각하면 된다.

// remix에서 배포한 스마트컨트랙트 주소
// Remix에서 배포했지만, 조작은 터미널로 한다
await web3.eth.getCode('0x1fe7d8A358Ea673eB5b7c5eb2D13915c35b7C7cc')
await web3.eth.getStorageAt('0x1fe7d8A358Ea673eB5b7c5eb2D13915c35b7C7cc',1)

상태변수를 private으로 설정해도, 변경하면 값이 바뀐다.

visibility는 접근할 수 있는 주체가 누구냐를 설정하는 것이다.

정말 중요한 기밀 정보는 getStorage를 통해서 조회할 수 있기 때문에 올리지 않는다. owner일 때만 가능하도록 해야 한다. 권한이 있는 사람이 서명해야만 접근할 수 있도록!

16진수 앞자리가 타입과 글자수를 알려준다

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)})})
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)})})

컨트랙트 생성

사인하고

서명한 정보를 보내기

돈이 안드는 함수는 .call() 로 호출했다

돈이 드는 함수, 즉 상태변수를 변경하는 함수는 .send()로 실행한다

	// 더 쉽게 배포하는 방법
await contract1.methods.setC(123456789).send({from: account.address, gas: 300000, gasPrice: 3000000})

infura.io

프로바이더를 제공하는 서비스

active endpoint - goerli (ethereum test network)

0개의 댓글