blockchain

이동화·2025년 7월 14일

블록 체인 : 참여자들이 블록 단위로 데이터를 기록하고 이를 추가적으로 암호화하여 개인에게 보관하게 함

비트코인 이전에도 연구 결과들이 있음

블록 : 블록 체인에서 정보를 처리하는 단위

일정 주기로 생성되며 그 사이에 모인 데이터를 배치 처리하는 구조

블록을 체인 형태로 엮은 것이 블록 체인이다.

간단하게 구조를 설명하면 header와 body가 있다. 헤더에는 timestamp, block number, 이전 블록의 hash, 블록이 담고 있는 데이터의 hash 정보가 헤더에 담기고 그 뒤에 데이터가 담긴 body가 존재한다.

블록을 체인해두면 블록 1번의 위변조 여부를 2번을 통해서 해시 값이 틀어졌는지 그런걸로 무결성을 검증한다. 즉, 블록 체인의 데이터는 신뢰성 있고 변조 불가능하다고 표현한다.

블록이라는 것을 어떻게 구현하냐면, timestamp, 이전 블록 hash, 지금 블록 번호, 데이터의 해시 값을 hashlib.sha256을 통해 해시한것이 블록의 해시값이다. (serialize)

블록의 해시값은 다음 블록의 헤더에 저장되어 있다. 이더리움,비트코인 같은거는 범용화 되어 있는 형태로 개발되어 transaction의 형태를 띈다. 그게 아니면 굳이 timeline 뭐 이런거만 적용하면 된다.

블록이라는 구조체에 데이터를 담아 체인하는 것이 중요하지 어떤 데이터를 담는지는 중요하지않다.

transaction이란 블록의 바디 영역에 포함된 데이터로, 네이티브 토큰 전송, 스마트 컨트랙트 실행, 컨트랙트 생성 등이 있다.

모든 작업들이 transaction으로 발생한다고 볼 수 있다.

블록체인 네트워크

탈 중앙화된 분산컴퓨팅 네트워크. 모든 노드가 동일한 원장을 유지 (즉 동일한 블록을 공유한다는 것). 트랜젝션이기에 체인 형태로 저장되고, 합의 알고리즘 pow pos를 통해 블록을 검증한다. 검증된 블록은 전체 네트워크에 전파된다. 블록이 생성되거나 받으면 인접한 노드를 브로드캐스팅하도록 유도된다. 즉 같은 노드를 공유하는 것이다. 이더리움이나 비트코인같은 public한거는 공개적이고 누구나 검증 가능한 데이터 구조를 가지고 있다. 보안성, 확장성, 탈중화간의균형이 중요하다.

node

노드는 블록 체인을 운영하는 서버라고 볼 수 있다. 사용자의 트랜잭션을 받아 생성, 검증 저장 전파하는 역할을 한다. 트랜잭션을 보내면 노드에게 전송되고 노드가 그 유효성을 검증하고 트랜잭션을 실행하기에 적합한 권한을 가져있는지 등을 검사한다. 합의 알고리즘에 따라 인접한 노드에 전달하고 p2p 네트워크 기반으로 서로 연결되어 데이터를 전파하고 상태를 공유한다.

consensus

블록 체인에 참여한 노드 간 데이터를 동기화하는 방법으로, 블록 체인에서 사용하는 프로토콜 역할을 한다고 보면 된다. 신뢰할 수 있는 중앙 주체가 없기에 노드 간 데이터를 동기화 하기 위한 알고리즘이다. 중앙 서버 없이도 신뢰 가능한 데이터 공유, 분산 컴퓨팅 환경이 구축되는 것이다.

블럭 생성 알고리즘으로 pow pos poa가 대표적으로 존재한다.

consensus 구성 요소에는 4가지가 있다. 블록을 선택하는 방식 (네트워크에서 인접한 노드로부터 노드를 받았을 때 선택할지 말지), 제안자 결정 알고리즘 (pow - 제일 빠른사람거, pos - 지분을 오래 스태킹 한 사람,poa - 컨소시움 체인이라는 곳에서 자주 사용하는 정해진 순서로 돌아가면서 만드는 방식)

트랜잭션 유효성 검증

제일 중요한거 : 분기(chain fork)가 발생했을 때 어떻게 하나의 체인으로 모을지

블록 선택

블록체인 네트워크는 탈중앙화되어 누구나 참여할 수 있다. 이더리움은 과거 pow 사용해서 컴퓨터만 있으면 채굴이란 행위를 할 수 있었다. 해시 값의 역치값을 찾아 0이 3개 이상 붙은 난수 값을 찾으면 컴퓨터들이 브루트 포스를 수행해서 조건에 해당하는 난수 값을 찾아 붙여 네트워크에 전파하면 한 번에 블럭이여러 개 생겨서 블록 선택 알고리즘에 의해서 받아들이게 된다. 이러면 두개이상의 체인이 이어질 수 있음. 하나만 선택할 때 뭘 선택할거냐가 블록 선택이다.

pow

컴퓨팅 파워를 이용해서 블록 생성 권한을 부여하는 것으로, 난이도에 따라 수학적 문제를 내고 그 수학적 문제를 가장 빨리 해결하면 블록을 가져갈 권리를 얻는다. nonce값을 원하는 것이 나올때까지 해시 값을 찾아 첨부하여 트랜잭션을 모아 블록을 제출하면 보상을 얻는다.

보안성이 높고 검증된 구조이다. 에너지 소비가 크고 속도가 느리다.

계속해서 채굴을 해서 블록을 만들어야 해서 그렇다.

pos

단순히 컴퓨팅 파워를 들여 무한 경쟁하는 것보다는 돈을 많이 투자하고 그 지분만큼 권한을 주는 것이다. 현재 대부분의 네트워크는 이걸 따르고 자본을 들여서 하는 것이기에 에너지는 효율적이고 생성 속도도 빠르다. 알고리즘에 따라서 누가 다음 블록을 선택할지 선택만 하면 됨. 그러나 블럭 독점, 중앙화의 위험이 존재한다. 개인이 snipping 하려다가 복잡해서 사람들이 모아준 돈으로 노드를 불려주는 서비스를 해서 절반 이상을 차지하는 상태가 되버리는 문제같은 것이다.

poa

탈중앙화된 형태는 아니고 신뢰받는 소수의 생성자가 블록을 생성하는 쪽으로 bns, kaia, vechian 등이 있다. 매우 빠르고 안정적이지만 탈중앙성이 부족함.

chain fork

블록 체인에 동시에 유효한블록이 생성되게 되면 그걸 받아들인 블록이 갈라져서 유효한 체인이 두 개가 생성된다. 네트워크 지연, 악의적인 공격, ㅂ르록 생성 타이밍이 겹쳤을 때 발생한다. 각노드는 블록 선택 로직에 따라 미리 합의한 consensus에 따라 ghost rule / longest chian rule 둘 중 하나를선택한다. pow에서는 체인의 길이가 곧 비용이라 체인이 길면 많은 돈이 들어가있다는 뜻이기 때문에 이 비용을 많이 들인 체인이 정상적인 체인이라고 가정한 것이다.

포크 이후 일정 시간이 지나면 하나의 체인이 길어진다. 나머지 체인이 버려지고 모든 노드가 선택된 체인으로 동기화된다.

이더리움 해킹당한거에 아직도 돈을 세탁중이라는 썰이 있다.

reorg

어느 시간이 지나면 강한 파워를 가진 걸로 모은다. 이걸 chain reorganization이라고 부른다.

근데 여기서 여러 취약점이 발생할 수 있다. 사용자를 추적할때, 거래소에 토큰을 보냇을 때 이게 일어나면은 100만원으로 이더리움을 사고 그게 사라졌을 때 100만원을 잃은 것이 된다.

byzantine fault

절대 다수가 거짓말 하지 않았을 때는 언젠가는 정상적인 상태로 돌아가야 한다는 알고리즘

분산 시스템 이론에서 매우 중요한 개념으로

일부 노드가 악의적이거나 임의로 잘못된 동작을 하는 상황에서 어떻게 배신자를 걸러내고 합의하여 돌아갈 것인지를 정의하고 있다. BFT라는게 있음

signature

블록체인 네트워크를 이용하면 트랜잭션을 적용하여 내가 생성한거, 내가 보낸거임을 증명하기 위해 필요하다. pow의 경우에는 없다 (이미 컴퓨터 파워를 들어서 답을 내는 것 만으로 충분) 다른 것에서는 필요함.

누가 트랜잭션을 보냈을 때 사용자가 보낸건지 맞는지 검증하기 위해 전자 서명이 필요함

자신의 개인 트랜잭션에 서명하는 행위로 트랜잭션을 검증한다고 하면 노드들이 서명 값을 검증해서유효한 대상으로부터 온게 맞는지 검증한다. 보통 시그니처를 만드는 과정은, 트랜잭션의 주요 필드들 nonce (다음에 들어올 트랜잭션은 이전 노드보다 1 커야 함.) , gasprice 등을 ecdsa 기법으로 시리얼라이즈 하고 공개 키 서명 알고리즘으로 서명을 생성하여 (대충 sha256) v, r, s 트랜잭션에 첨부해서 보낸다.

v는 플마 (방향 선택)

sig verify

검증하는 사람은 반대로 주요 필드를 rlp 인코딩 한 다음에 해시해서 v r s를 조합해서 서명을 복원한다. messagehash와 msg를 이용해서 공개키를 복원하여 트랜잭션을 보낸 사람의 지갑 주소를 구할 수 있다.

블록 또는 트랜잭션을 누가 보냈는지 제 3자가보장을 안해도 검증할 수 있다.

ecdsa - 타원 곡선 (어려워서 pass)

smart contract

당시에는 신뢰할 수 있는 분산 컴퓨팅 환경을 구축할 수 없었다

2009년 즈음에 비트코인이 아주 간단한 스크립트를 실행하는 분산 컴퓨팅 환경을 구축하게 된다.

2013년 비탈릭 부테린이 튜링 완전한 언어로 동작하는 스마트 컨트랙트를 제안하였고 2015년에 EVM에서 동작하는 스마트 컨트랙트를 런칭했다.

다양한언어 py, solidity, rust, js 등

하이 레벨 언어이기 때문에 해당 네트워크의 런타임에 실행 가능한 형태로 컴파일 됨

체인에 항상 데이터가 쌓여 감소할 수 없는 구조로 쌓여있다. 정해진 바이너리 폼에서 실행하면 가비지데이터가 너무 많다 (앞뒤로 붙는거) wasm은 경량화되었음

evm 기반에서는 솔리디티를 가장 많이 쓰고 바이퍼는 보안성을 강조한 pythonic 프로그래밍 언어 (근데 털렸다고함 최근에)

move는 rust로 개발된 vm위에서 실행되어 체인에서 앱을 개발할 때 사용되는 언어. yul, huff는 어셈블리 역할을 하는 저수준 언어 (지금은 뭐 망했다고 하는데)

  • DAO 운영 : 이더이룸에 뼈아픈 타격을 줬다고 하는데 ㅁㄹ
  • 토큰, NFT 발행 가능
  • NFT 거래 및 경매 가능
  • DeFi 시스템 (거래하는 swap context, 빌려주는 lending context)

bitcoin

비트 코인이 처음으로 나올때 0번째 블록의 0번째 트랜잭션으로 뭔갈 적었음

서브 프라임 : 신용 불량 대출 상품 / 집을 구매하는 대출을 해주고 그 대출을 기반으로 채권을 연결해서 다른사람한테 팔았다. 근데 이게 여파가 커져서 영국에 여파가 갔고 영국 은행을 살리기 위해 국고 투입하겠다는 뉴스가 그내용임

블록 체인의 시초

사토시 나카모토가 제안한 논문에서 출발, 2009년 1월에 금융 시스템에 대한 비판을 담은 헤드라인이 들어있고 컴퓨터가 복잡한 퍼즐을 풀면 블록을 생성하고 보상을 주는 방식.

비트코인이 전부 풀리면 더 이상 가치가 없어짐 (다 채굴되고 나면)

이거 때문에 금과 다르게 한정된 자원이라 가치를 부여하고 있는 것

bitcoin script로 자산 소유, 이전 조건을 지정함

계좌라는 건 없고 utxo 기반 사용되지 않는 출력을 주고받는 구조로 되어있음

즉 사용된 것은 다시 사용될 수 없음

잔액 관리는 새로운 트랜잭션을 만들때 자신이 보유한 utxo를 사용해서 utxo를 생성, 그걸 보냄. 잔액 조회는 특정 주소가 소유한 모든 utxo의 합계로 계산

기존에 가지고 있는 1개 → 0.5의 새로운 utxo, 보내줄 새로운 utxo로 생겨남

모든 트랜잭션은 다른 트랜잭션으로 나뉜다는 것임, 입력값은 소비되는 형태

output으로 거슬러 받은 utxo, 상대에게 보낼 utxo

bitcoin script

bitcoin은 스택 기반의 아주 간단한 기능만 제공하는 스크립트

p2pk

사용자는 이전 출력 utxo를 가고있는 상태에서 이전의 출력이 새로운 트랜잭션의 입력으로 사용한다.

이때 이제 비트코인 네트워크에서는 시그니처라는 값이 사용되어 소유한 사용자임을 증명하고, 스크립트의 인풋으로 사용되기도 한다. 초기에 스택이 비어있지만 이 트랜잭션을 전송하면 시그니처가 스택의 제일 아래에 들어가게 되고, 그 다음에 공개키가 들어간다. 자신이 받은 utxo를 소모할 때에는 스택에 시그니처와 pub 키를 소모하게 된다. op check sig이 사용되면 시그니처를 통해 pub키가 일치하는지를 비교한다. 누군가에게 전송할 때 그 사람의 공개키와 opchecksig을 담고, 사용할 때 시그니처가 검증이 되어야 사용이 가능 (pubkey+op_checksig를 통해 시그니처 검증)

그냥 utxo를 어떻게 디자인하느냐에 따라 제품이 다르게 설계된다. 어떤 걸 utxo에 담을건지 등. 뭔가를 개발할거면 script, utxo에 대해서 공부를 해보면 된다.

ethereum

이더리움은 smart contract를 실행할 수 있는 블록체인 플랫폼으로, 다양한 형태의 dapp을 개발 가능. 스크립트가 강력함. 초기에는 작업 증명 기반으로 블록을 생성했지만 블록을 채굴하는 사람들이 트랜잭션을 자기에게 이득이 되는 방향으로 만들어가니까 merge 업그레이드를 통해 pos 방식으로 전환했다.

defi, nft, dao 등 다양한 온체인 서비스의 핵심 인프라로활용되고 있다.

비트코인과는 다른 계정 모델을 사용하고, 개인 계정과는 다르게 스마트 컨트랙트는 코드를 포함한 계정이다.

지갑을 생성하면 지갑 스토리지가 할당이 되고 잔액이 기록이 된다. 새로운 utxo 생기는게 아니라 그냥 통장처럼 내건 줄고 상대건 늘어난다.

스마트 컨트랙트를 통해 만들어진건 CA라고 다르게 불림

  • world state : 블록 체인 상 존재하는 모든 계정의 상태를 담은 저장소 EOA, CA 계정이 있고 블록이 생성될 때 마다 트랜잭션 실행 결과에 따라 world state가 변경된다.

merkle root

모든 트랜잭션의 해시를 요약한 값으로, 트랜잭션 해시한 값들을 이진 트리 구조로 구성한 것이다. 이렇게 하면 블록 하나에 트랜잭션이 1000개 있고 5번재 리프 노드만을 보고 싶을 때 빠르게 접근하기 위해서 최소한의 데이터로 검증하고 싶은 트랜잭션이 블록에 포함되어있는지 확인하기 위해 사용한다.

소량의 데이터 만으로 특정 트랜잭션이 유효한지 확인이 가능하다.

최상단을 머클 루트라고 한다.

MPT (merkle patricia trie)

trie : 자료구조 , 문자열 검색에서 자주 사용함

이더리움은 이 구조로 관리하는데 world state, storage, code hash와 같은 것들을 여기서 관리한다. 각 계정의 주소를 keccak256으로 해시한 값을 키로 하여 상태 데이터를 저장하고 트리의 각 노드는 구조체라고 보면 되는데 인코딩한 결과가 keccack256 노드 식별자로 사용된다. 주소가 주어지면 주소를 해시한 값으로 찾아가되 노드를 찾아갔을 때 그 노드의 데이터에 해시한 값을 넣어주는 방식이다. 결국 이런 구조로 검색 속도를 높이고 검증도 가볍게 할 수 있게 만든 데이터 구조이다.

노드가 구동되는 과정에서 데이터를 변경한다고 할 때 이 trie를 참조하고 노드가 꺼졌을 때 복원하려고 할 때도 사용된다.

smart contract (이더리움)

solidity로 기술하여 컴파일하여 바이트 코드의 형태로 컴파일된다

deploy 할 때는 바이트 코드를 트랜잭션으로 전송하면 블록체인 네트워크가 계정을 생성하고 그걸 사용자에게 돌려준다.

사용자가 tx를 전송, 바로 실행되지는 않고 mempool에 모이고 mempool에 모인걸 채굴자가 읽어 블록에 담아 자신이 서명을 하거나 블록에 정한 디피컬트에 맞게 네트워크에 보내면 이게 accept되면 이더리움을 돌려준다 (보상)

gas

이더리움이 분산 컴퓨팅 환경이고 컴퓨터 사용에 비용이 드는데, tx는 스마트 컨트랙트에 입력 값을 전달할 때 프로그램 실행을 유도하는 동작. 실행에는 계산 비용이 따르며 이를 가스 단위로 측정한다. 네트워크 자원을 사용하는 비용을 정량화한 개념으로, 각 네트워크는 opcode나 리소스 사용량에 따라 가스 비용을 계산한다 .네트워크 과부하를 방지하고 무한 루프 공격을 억제하는 중요한 보안 메커니즘이다

가스비가 너무 저렴하거나 0원이면 solidity tx를 보내면 마비되고 막 그럴거임

그래서 꼭 필요한 행동만 하게됨

이더리움 전송할때는 딱히 데이터가 필요하진 않고 인풋, to 정도의 필드만 채워져 있다

tx는 selector (호출할 메서드) , arg (입력값들) 으로 이루어진다

used gas * gas price → 높은 가격을 부르면 tx가 빨리 실행될 확률이 높아짐

profile
notion이 나은듯

0개의 댓글