전체 글 114

#19 geth

본격적으로 이더리움 테스트넷을 구동해 작업을 시도하기 전에 저번에 간략하게 소개한 geth의 몇 가지 기능들을 사용하는 법을 알아보자. 1. 블록 동기화 테스트용 네트워크를 구동하는 기능과 더불어 실제 이더리움의 메인 네트워크와 동기화하는 기능도 geth는 가지고 있다. 동기화에는 3가지 유형이 있는데 i) full sync : 모든 블록과 tx 데이터를 가져온다. ii) fast sync : 최근 1024개 블록의 블록 헤드만을 가져온다. iii) light sync : 현재의 상태만을 가져온다. 검증하기 위해서는 다른 full sync 노드들의 도움이 필요하다. (채굴 기능을 사용할 수 없다.) light sync 기능을 사용해 이더리움 네트워크와 동기화해보자. geth --syncmode light..

Blockchain 2022.06.30

#18 metamask 활용

이번 글에서는 지금까지 배운 툴들을 이용해 내 지갑에서 블록체인과 상호작용하는 방식에 대해 알아보자. web3, ganache-cli, metamask를 이용해 블록체인 네트워크에 요청을 보내 tx를 일으키는 기본적인 dApp을 만드는 것이 목표이다. 이번에는 프론트는 리액트로, 블록체인 네트워크는 전 글에서 만든 ganache-cli 제공 네트워크를 사용해볼 것이다. 우리가 #16까지 실제로 작동하는 블록체인을 만들었을 때 wallet 폴더에 server가 따로 있었고, 프론트에서 요청을 보내면 wallet/server.ts에서 이걸 받아 블록체인 네트워크로 요청을 전달했다. wallet 폴더의 server.ts를 편하게 지갑서버라고 불렀는데, 메타마스크가 이 지갑 서버라고 보면 된다. 우리가 프론트에..

Blockchain 2022.06.29

#17 ethereum

#16까지 알아본 블록체인과 tx는 최초의 암호화폐인 비트코인의 작동방식이었다. 이 후에 나온 이더리움은 비트코인과는 다른 용도로 만들어졌다. 비트코인은 가치의 저장 수단으로서 만들어진 이른바 디지털 금이라면, 이더리움은 네트워크에서 화폐의 지불과 송금뿐 아니라 스마트 컨트렉트 등, 사용자들이 블록체인 네트워크 상에서 가장 단순하게 A가 B에게 돈을 주되 특정한 조건이 만족되어야만 돈이 B에게 전달된다던지 등 단순히 돈을 주고 받는 것 이외에 계약이라는 것을 구현할수 있게끔 설계된 디지털 석유라고 볼 수 있다. 우리들의 먼 목표는 이 이더리움이라는 플랫폼 안에서 스마트 컨트랙트를 구현하는 것이지만 우선 이더리움 네트워크를 사용하는 기본적인 방법과 라이브러리, 프로그램부터 알아가자. 1. Go ethere..

Blockchain 2022.06.29

#16 transaction ch.6 - tx pool

tx 객체가 생성되면 이 객체는 바로 블록에 기록되는 것이 아니라 다음 블록이 생성될 때까지 기다려야 한다. 이런 tx들을 임시로 저장하는 곳을 txpool이라고 하는데 이 또한 Chain class 내에 저장하고 사용할 수 있다. 우선 chain class 안에 transactionPool 속성과 간단한 기능을 가진 tx pool 관련 함수를 추가해주자. 1. tx pool 속성 추가 /* src/core/blockchain/chain.ts */ // ...중략 export class Chain { public blockchain : Block[] private unspentTxOuts : unspentTxOut[] private transactionPool : ITransaction[] constru..

Blockchain 2022.06.27

#15 transaction ch.5 - utxo update

tx pool에 대해 알아보기 전에 우선 새로운 블록이 체인에 추가되었을 경우, 다른 네트워크 참여자들에게 utxo에 대한 정보를 최신화 시켜주는 방식에 대해 알아보자. 예전에 P2PServer class 객체를 만들어 줄 때처럼 몇 가지 경우로 나눠 생각해보면 좀 더 머리에 잘 들어온다. i) 내가 체인에 블럭을 추가했을 때 (채굴자 시점) 이미 우리는 addBlock 함수에서 newBlock을 만들어 chain에 넣었다. 이 newBlock의 tx들을 참조해 utxo를 업데이트 해주면 된다. /* src/core/blockchain/chain.ts */ // ...중략 public addBlock ( data : ITransaction[]) : Failable { //..

Blockchain 2022.06.27

#14 transaction ch4. - transaction

이제 채굴자의 코인베이스 외에 지갑과 지갑간의 일반적인 tx를 구현해보자. 1. intro 채굴시 생성되는 utxo는 출금이 없이 입금만 있지만, 이번처럼 지갑에서 지갑으로 이동하는 tx는 TxIn에서 txOutId, _txOutIndex, _signature를 전부 적절히 채워주어야 한다. 출금하려는 지갑의 주소로 된 utxo를 찾아 서명을 추가해 TxIn의 데이터를 만들고 입금할 계좌, 금액 데이터로 TxOut 를 만든다. 이들을 전부 모아 transaction class 객체로 만든 후, 블록체인에 기록하면 된다. 지갑을 2개 만들어 하나는 출금 지갑, 하나는 입금 지갑으로 사용하자. 지갑1에서 지갑2로 코인을 보내려면 만들어둔 웹 페이지에서 보내는 사람의 지갑 주소와 코인의 양을 입력하고 전송버튼..

Blockchain 2022.06.24

#13 tx ch3. 채굴자 보상

1. intro 본격적으로 tx를 구현해보자. tx를 구성하는건 입금 기록, 출금 기록, utxo (unspent transaction output) 크게 3가지를 꼽을 수 있다. 지갑 잔고가 50 BTC였던 지갑 A 에서 10BTC를 지갑 B로 코인을 전송했다고 하자. i) 출금 기록 출금 기록은 출금한 지갑 주소, 출금 액수 2가지가 주요 구성 성분이다. A : 10BTC ii) 입금 기록 입금 기록은 입금받은 지갑 주소와 액수 2가지가 기록된다. B : 10BTC iii) UTXO UTXO에는 잔금 목록이 업데이트 된다. Before : (A : 50BTC) After : ( A : 50-10BTC, B : 10BTC ) 모든 거래는 이처럼 입금과 출금, utxo에 대한 데이터가 남지만 단 한 가지..

Blockchain 2022.06.23

#12 Transaction ch2.코인 전송

이번 글에서는 실제로 코인을 전송하는 것을 구현해보자. 1. set up 1.1 axios set up 앞으로는 나 혼자서 블록체인 서버와 지갑 서버 두 개의 서버를 구동하고, 이 두 서버들 사이의 상호작용을 활용해야 한다. 이 때 생길 수 있는 CORS 에러 등의 문제를 미리 방지하고 두 서버의 상호작용을 조금 더 편리하게 할 수 있도록 Basic과 axios의 메소드 하나를 활용할 것이다. Basic이란 원래 uri에서 통신 프로토콜과 호스트 사이에 접속하고자 하는 사용자의 개인 정보를 넣어줌으로써 uri에서 로그인과 유사한 기능을 사용할 수 있게 만드는 장치이다. 클라이언트가 서버에 접속할 때, 아이디와 비밀번호를 입력해 host에 함께 요청하면 서버는 uri의 basic을 읽어 허용된 클라이언트인..

Blockchain 2022.06.22

#11 Transaction ch1.개념

Transaction이라는 단어에는 여러 가지 의미가 있지만 여기서는 한 지갑에서 다른 지갑으로 돈/코인을 전송하는 행위라고 보면 된다. 이 트랜잭션 (이하 tx) 를 정확하게 발생시키기 위해서는 생각보다 개입되는 요소가 매우 많은데, 각각의 정의가 무엇인지, tx 과정에서 어떤 역할을 하는지를 먼저 알고 넘어가도록 하자. 지갑1에서 지갑2로 지갑을 보낼 때 필요한 정보엔 어떤 것들이 있을까. 우선 어디로 보낼지 지갑의 주소를 특정지어주는 수신인의 지갑 주소가 필요하다. 발신인 지갑 입장에서는 액수를 적어보내면 된다. 그리고나서 여러가지 검증 단계를 거쳐야 한다. 누군가 지갑1에서 지갑2로 코인을 10개 보낸다고 할 때, 우선 지갑1에 a) 충분한 액수의 코인이 있는지, (실제로 수수료를 감안하면 10개..

Blockchain 2022.06.22

#10 지갑, 개인키

이제부턴 암호화폐 지갑에서 다른 지갑으로 트랜잭션을 일으키고, 이를 블록체인에 기록으로 남기는 것에 대해 공부를 할 예정이다. 우선 지갑을 생성하는 방법에 대해 알아보고, 그 지갑은 어떻게 지키는지 상대방에게 내 지갑이 어떤 것인지를 어떤 방식으로 알려주는지 등에 대해 알아보자. 1. set up npm i crypto npm i elliptic npm i --save-dev elliptic 우선 터미널에서 npm으로 crypto, elliptic 라이브러리를 설치한 후, 다음과 같이 core 폴더에 wallet 폴더를 만들고, 그 안에 wallet.test.ts 파일을 생성한다. /* core/wallet/wallet.test.ts */ import { randomBytes } from 'crypto'..

Blockchain 2022.06.20

#9 체인 최신화

블록체인 네트워크 내의 모든 사람들이 동일한 체인을 가진다. 이를 위해서는 실시간 통신을 활용해 블록체인에 업데이트할 내용이 있는지를 확인한 후 블록체인을 최신화하는 것이 필요하다. 이제부터는 http, webSocket을 이용해 서로 가지고 있는 블럭체인에 대한 정보를 교환하고 그 정보에 따라 맞는 코드를 실행해 적절하게 블럭의 정보를 최신화하는 것을 구현할 것이다. 우선 서버를 실행하기 위해 express, ws 라이브러리를 설치한다. npm i express npm i --save-dev @types/express npm i ws npm i --save-dev @types/ws 루트 디렉토리에 index.ts 파일을 만들고 서버에 관련된 코드를 작성한다. 1. 서버 구축, 구동 /* index.ts..

Blockchain 2022.06.17

#8 mining ch.2 - 활용

저번 글에서 공부한 nonce와 difficulty가 어떻게 활용되는지 알아보자. 우선 새로운 속성이 추가되는만큼 IBlock class 객체의 구성을 수정해주어야 한다. /* @types/Block.d.ts */ declare interface IBlockHeader { version : string height : number timestamp : number previousHash : string } declare interface IBlock extends IBlockHeader { merkleRoot : string hash : string data : string[] nonce : number difficulty : number // 아래 두 줄을 추가 } 제네시스 블럭을 포함한 Block c..

Blockchain 2022.06.17

#7 mining ch.1 - 개념

이번에는 블럭을 '채굴'한다는 것이 무엇인지, 구체적으로 어떻게 이루어지는지 알아보자. 개인적으로 이 파트를 공부하면서 코드로 구현하는것도 중요하겠지만 우선 각 용어의 정의를 명확하게 인지하고 가는 것이 다른 부분에 비해 매우 비중이 높다고 생각했다. 그래서 개념에 대한 정리를 먼저하고, 이를 코드로 구현하는 것은 나중에 할 것이다. 블럭을 아무나 쉽게 만들어서 가져다 붙일 수 있게 하면 안된다. 그래서 블럭 체인 네트워크에서는 특정 작업을 완료한 사람만이 블럭체인에 블럭을 추가할 수 있는 자격을 부여한다. 작업을 완료한 후, 이를 다른 네트워크 참여자들에게 검증을 거친 후 (증명), 블럭체인에 새로운 블럭을 추가하는 것을 채굴이라고 하며 이 채굴 방식은 작업의 증명, 작업증명(Proof of Work,..

Blockchain 2022.06.17

#6 chain

이제 블럭에 대한 기본적인 사항들은 공부를 했으니 체인, 블럭을 체인으로 이은 블럭체인이 무엇인지 알아보자. 체인은 이미 공부한 것이나 다름없다. 한 블럭이 다른 블럭의 다음에 온다는 것을 알려주는 것이 바로 hash값과 previousHash 값이다. n번째 block의 hash 값이 n+1 번째 block의 previousHash와 동일하다면 이 두 블럭이 연속된 순서로 온다는 것을 쉽게 알 수 있다. 이 해시의 동일성 자체가 그 블럭을 이어주는 chain이라고 볼 수 있다. blockchain은 순서를 알고 있는 (chain으로 이어진 관계를 가진) 일련의 블럭들을 배열에 담은 것을 의미한다. 본격적으로 chain, blockchain을 코드로 구현하기 전에 약간 데이터의 재배치를 진행하도록 하자...

Blockchain 2022.06.12

#5 block 검증

다른 사람이 만든 블럭을 그냥 가져다 쓸 수는 없다. 이 블럭이 제대로 된 블럭인지를 먼저 검증하는 과정이 반드시 필요하다. 다른 사람이 만든 블럭을 봤을 때 이 블럭이 제대로 된 블럭인가? 를 판별하는 기준은 3가지가 있다. a) 새로운 블럭의 height 값이 이전 블럭의 height + 1 의 값을 가지는가? b) 이전 블럭의 hash 값과 새로운 블럭의 previousHash 값이 같은가? c) 새로운 블럭이 가진 data들, 정확히는 version, merkleRoot, timestamp, height, previousHash 값을 조합해 내가 hash값을 만들어봤을 때, 이 블럭이 가진 hash 값이 정말 나오는가? 셋 중 하나라도 만족하지 못하면 이 블럭은 잘못된 블럭이다. 이 검증과정은 간..

Blockchain 2022.06.12