블록 체인 구현 방법 | 블록체인. 개발자가 쉽게 설명해드림. 10분컷. 인기 답변 업데이트

당신은 주제를 찾고 있습니까 “블록 체인 구현 방법 – 블록체인. 개발자가 쉽게 설명해드림. 10분컷.“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 노마드 코더 Nomad Coders 이(가) 작성한 기사에는 조회수 282,154회 및 좋아요 9,995개 개의 좋아요가 있습니다.

시나리오
  1. 중앙 노드는 블록체인을 생성한다.
  2. 다른 지갑 노드들은 중앙 노드에 연결되어 블록체인을 다운로드 받는다.
  3. 채굴자 노드들도 중앙 노드에 연결되어 블록체인을 다운로드 받는다.
  4. 지갑 노드는 트랜잭션을 생성한다.
  5. 채굴자 노드는 트랜잭션을 받아 메모리풀에 저장해둔다.

블록 체인 구현 방법 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 블록체인. 개발자가 쉽게 설명해드림. 10분컷. – 블록 체인 구현 방법 주제에 대한 세부정보를 참조하세요

마침내 블록체인 제대로 이해하기…!
/
📌 Typescript로 블록체인 만들기 (무료)
https://bit.ly/3n2XCtQ

📌 Go로 암호화폐 만들기
https://bit.ly/3n05fBe

블록 체인 구현 방법 주제에 대한 자세한 내용은 여기를 참조하세요.

블록체인 구현 방법

블록체인을 구현하기 위해서는 어떤 방법을 써야 할까요? 블록체인은 데이터를 분산 저장하여 한 번 저장된 결과는 바뀌지 않는 일종의 위변조 방지 기술로 만들어 …

+ 더 읽기

Source: becoinmaker.github.io

Date Published: 10/3/2022

View: 9869

파이썬으로 블록체인 만들기 Part 1 – Medium

블록에 거래를 추가할 방법이 필요하다. new_transaction() 이 이를 위해서 필요하다. 이제 부터 이 부분을 추가로 구현해보자.

+ 여기에 보기

Source: medium.com

Date Published: 8/12/2022

View: 4277

블록체인 기반 프로젝트 시작하기 전, 알아야 할 사항들 – IBM

러 조직이 연계하는 영역에서 새로운 비즈니스 프로세스를 구현하는 블록체인을 … 같은 각국의 컴플라이언스를 피하기 위한 방법 등 많은 사안이 논의되고 있다.

+ 여기에 더 보기

Source: www.ibm.com

Date Published: 9/16/2021

View: 6087

간단한 블록체인을 구현해보며 이해하기

블록과 체인을 하나씩 코드로 구현한다면 무엇으로 표현 할 수 있을까요? … 그래서 보통 사용하는 방법은 해시값을 어차피 구할 거면 앞에 “0”으로 …

+ 여기를 클릭

Source: rudalson.tistory.com

Date Published: 5/15/2021

View: 8174

[특허]블록체인 구현 방법 및 시스템 – ScienceON

블록체인 구현 방법 및 시스템 · 사바나, 스테판 / 영국, 씨에프** *에이치에이치 카디프, 처칠 웨이, 처칠 하우스 *층, 어커트-디키스 앤 로드 엘엘피 · 라이트, 크레이그 …

+ 더 읽기

Source: scienceon.kisti.re.kr

Date Published: 1/11/2022

View: 3944

블록체인 – 나무위키

퍼블릭 블록체인의 첫 번째 구현 사례라고 볼 수 있는 비트코인에서는, … 류의 블록체인 어택은 타임스탬스상의 순간적인 하드포크를 사용한 방법 …

+ 여기에 보기

Source: namu.wiki

Date Published: 6/9/2022

View: 6668

블록체인 기술이란 무엇인가요? 최종 설명 | Binance Academy

블록체인은 비트코인과 이더리움, 다른 암호화폐의 핵심 기술입니다. … 바이낸스에서 비트코인 출금하는 방법; 트러스트 월렛에서 일렉트럼으로 …

+ 더 읽기

Source: academy.binance.com

Date Published: 1/22/2022

View: 7926

주제와 관련된 이미지 블록 체인 구현 방법

주제와 관련된 더 많은 사진을 참조하십시오 블록체인. 개발자가 쉽게 설명해드림. 10분컷.. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

블록체인. 개발자가 쉽게 설명해드림. 10분컷.
블록체인. 개발자가 쉽게 설명해드림. 10분컷.

주제에 대한 기사 평가 블록 체인 구현 방법

  • Author: 노마드 코더 Nomad Coders
  • Views: 조회수 282,154회
  • Likes: 좋아요 9,995개
  • Date Published: 2021. 3. 7.
  • Video Url link: https://www.youtube.com/watch?v=Ca7Meu4z-F4

[Go로 구현하는 블록체인] Part 7: 네트워크

Building Blockchain in Go 시리즈를 번역한 글입니다.

서론

지금까지 우리는 익명의 안전하고 무작위로 생성된 주소, 블록체인 데이터 저장소, 작업 증명 시스템, 신뢰할 수 있는 트랜잭션 저장 방법등의 핵심 기능들을 모두 갖춘 블록체인을 만들었다. 이 기능들도 물론 중요하지만 아직 부족하다. 이 기능들을 실제로 빛나게하고 암호화 화폐를 가능케 하는것은 바로 네트워크이다. 이러한 블록체인을 하나의 컴퓨터에서만 실행하면 무슨 소용인가? 단 한 명의 사용자만 있다면 이러한 암호화 기반의 기능들이 무슨 소용인가? 이 메커니즘들을 작동시키고 유용하게 만드는건 네트워크이다.

이러한 블록체인의 기능들은 하나의 규칙으로 생각할 수 있다. 사람들이 함께 살고 번영하고 싶어서 세우는 사회 질서의 규칙들과 유사하다. 블록체인 네트워크는 네트워크를 활성화시키는 동일한 규칙을 따르는 프로그램들의 커뮤니티이다. 마찬가지로, 사람들이 똑같은 생각을 공유할 때 그들은 강해지고 함께 더 나은 삶을 살 수 있다. 사람들이 서로 다른 규칙을 따르면 그들은 분리된 사회에서 살게된다. 이와 동일하게, 블록체인 노드들이 서로 다른 규칙을 따르면 이는 분리된 네트워크를 형성하게 될 것이다.

매우 중요함: 네트워크가 없고 대다수의 노드가 동일한 규칙을 공유하지 않는다면 이러한 규칙들은 쓸모가 없다.

아쉽게도, 필자는 P2P 네트워크 프로토타입을 구현할 시간이 없었다. 이 파트에서는 서로 다른 타입의 노드를 포함하는 가장 일반적인 시나리오 하나를 시연해볼 것이다. 이 시나리오를 개선하고 P2P 네트워크를 구현해보는건 여러분에게 훌륭한 도전거리가 될 것이다. 또한, 이 파트에서 구현한 네트워크가 시연할 시나리오 이외의 시나리오에서도 잘 동작할지는 보장할 수 없다. 이 부분은 죄송하다! 이 파트에서는 중요한 코드 변경사항을 소개하기 때문에 모든 코드를 설명하는건 의미가 없다. 모든 변경사항은 여기를 참조하라.

블록체인 네트워크

블록체인 네트워크는 분산되어있어 작업을 수행하는 서버와 서버에서 데이터를 가져와 처리하는 클라이언트가 따로 없다. 블록체인 네트워크에는 노드가 존재하며 각 노드들은 네트워크의 일원으로서 자격을 지닌다. 노드는 클라이언트이자 서버이다. 일반적인 웹 애플리케이션과 매우 다르기 때문에 꼭 명심하길 바란다.

블록체인 네트워크는 P2P (Peer-to-Peer) 네트워크기 때문에 노드들은 서로 직접 연결되어있다. 이 구조의 토폴로지는 평면인데 노드 역할에는 계층이 없기 때문이다. 이를 도식화하면 다음과 같다.

이러한 네트워크의 노드는 많은 연산을 수행해야하기 때문에 구현하기가 더욱 까다롭다. 각 노드는 다른 여러 노드들과 상호작용 해야하며, 다른 노드의 상태를 요청하고 자신의 상태와 비교해 오래된 값이면 상태를 업데이트 해야한다.

노드의 역할

블록체인의 노드들은 모두 완전한 기능을 갖추고 있지만 네트워크에서 서로 다른 역할을 수행할 수 있다. 역할은 다음과 같다.

채굴 노드: 채굴 노드는 ASIC과 같은 강력하고 특수한 하드웨어 위에서 동작하며, 이 노드들의 유일한 목적은 새로운 블록을 가능한한 빠르게 채굴하는 것이다. 채굴 노드는 작업 증명 시스템을 사용하는 블록체인에서만 가능하다. 채굴이란게 실제로는 PoW 퍼즐을 푸는 일이기 때문이다. 한 예로, 지분 증명 (Proof-of-Stake) 블록체인에는 채굴이 없다. 풀 노드: 이 노드는 채굴 노드에 의해 채굴된 블록의 유효성을 확인하고 트랜잭션을 검증한다. 이 작업을 위해선 블록체인의 전체 복제본이 필요하다. 또한 이 노드는 다른 노드들이 서로를 찾을 수 있도록 돕는일과 같은 라우팅 연산을 수행하기도 한다. 풀 노드는 블록 및 트랜잭션의 유효성을 검사하고 의사결정을 하는 노드이기 때문에 네트워크는 많은 풀 노드를 갖는게 중요하다. SPV: SPV는 Simplified Payment Verification의 약자이다. 이 노드는 블록체인의 전체 복사본을 저장하고 있지는 않지만 트랜잭션 검증은 가능하다 (단, 모든 검증 작업이 가능한건 아니며 일부만 가능하다. 예를 들어, 어떤 트랜잭션이 특정 주소에서 전송되었는지 확인하는 검증은 가능하다). SPV 노드는 풀 노드로부터 데이터를 얻어오며 하나의 풀 노드에 여러개의 SPV 노드가 연결될 수 있다. SPV는 지갑 애플리케이션을 가능케한다. 개인은 전체 블록체인을 다운로드 받을 필요는 없으나 여전히 트랜잭션을 검증할 수 있다.

네트워크 단순화

우리가 만든 블록체인에서 네트워크를 구현하기 위해선 일부 기능들을 단순화 시켜야한다. 한 가지 문제는 다수의 노드를 가진 네트워크를 시뮬레이션 하기 위해 필요한 충분한 수의 컴퓨터를 가지고 있지 않다는 것이다. 이 문제를 해결하기 위해 가상머신이나 도커를 사용할 수도 있지만 되려 더 어려워질 수가 있다. 블록체인 구현에만 집중하는게 목표인데 가상머신이나 도커를 사용하면서 발생할 수 있는 이슈를 해결해야할 수도 있기 때문이다. 따라서 우리는 하나의 머신에서 여러 블록체인 노드를 동시에 실행하여 각 노드에 서로 다른 주소를 할당해 사용할 것이다. 이를 위해 IP 주소 대신 포트를 노드 식별자로 사용할 것이다. 예로 127.0.0.1:3000, 127.0.0.1:3001, 127.0.0.1:3002 등의 주소를 가진 노드가 있을 수 있다. 우리는 포트를 노드 ID로 두고 NODE_ID 환경 변수를 사용해 값을 설정할 것이다. 따라서, 여러대의 터미널창을 띄워 서로 다른 NODE_ID를 설정해 독립된 노드들을 실행할 수 있다.

이 방법을 사용하려면 서로 다른 블록체인과 지갑 파일이 필요하다. 이 파일들은 노드 ID를 사용해 blockchain_3000.db, blockchain_3001.db 및 wallet_3000.db, wallet_3001.db 등과 같이 명명할 것이다.

구현

비트코인 코어를 다운로드하여 처음 실행하면 어떤 일이 일어날까? 최신 상태의 블록체인을 다운로드 받기 위해 일부 노드와 연결되어야 한다. 컴퓨터가 비트코인의 전체 또는 일부 노드를 인식하지 못한다는것을 고려할 때, 이 노드는 어떤게 될 수 있을까?

비트코인 코어에서 노드 주소를 하드코딩하면 잘못될 수도 있다. 노드는 공격 당하거나 종료되어 새로운 노드가 네트워크에 참여할 수 없게될 수도 있다. 비트코인 코어에서는 대신 DNS 시드가 하드코딩 되어있다. 이는 노드가 아니며 일부 노드의 주소를 알고 있는 DNS 서버이다. 비트코인 코어를 최초로 실행하면 코어는 시드중 하나에 연결되어 블록체인을 다운로드 받을 풀 노드들의 주소가 담긴 리스트를 받아올 것이다.

하지만 우리의 구현에서는 중앙 집중화가 이루어질 것이다. 우리는 세 종류의 노드를 갖는다.

중앙 노드: 모든 노드와 연결되어 있는 노드이며 다른 노드들간에 데이터를 전송하는 노드이다. 채굴자 노드: 이 노드는 새로운 트랜잭션을 mempool에 저장하며 충분한 양의 트랜잭션이 쌓이면 새로운 블록을 채굴한다. 지갑 노드: 이 노드는 지갑간 코인을 전송하는데 사용된다. SPV 노드와는 다르게 블록체인의 전체 복사본을 저장한다.

시나리오

목표는 다음 시나리오를 구현하는 것이다.

중앙 노드는 블록체인을 생성한다. 다른 지갑 노드들은 중앙 노드에 연결되어 블록체인을 다운로드 받는다. 채굴자 노드들도 중앙 노드에 연결되어 블록체인을 다운로드 받는다. 지갑 노드는 트랜잭션을 생성한다. 채굴자 노드는 트랜잭션을 받아 메모리풀에 저장해둔다. 메모리풀에 충분한 양의 트랜잭션이 쌓이면 채굴자 노드는 새로운 블록의 채굴을 시작한다. 새로운 블록이 채굴되면, 중앙 노드에 전송된다. 지갑 노드는 중앙 노드와 동기화된다. 지갑 노드의 사용자는 지불이 정상적으로 이루어졌는지 확인한다.

이는 비트코인에서의 시나리오와 유사하다. 물론 실제 P2P 네트워크를 구축하지는 않겠지만 비트코인의 실제로 동작하는 가장 중요한 사용 사례를 구현할 것이다.

버전

노드는 메시지를 통해 통신한다. 새로운 노드가 실행되면 DNS 시드에서 여러 노드를 가져와 version 메시지를 전송한다. 메시지는 다음과 같이 구현할 수 있다.

type version struct { Version int BestHeight int AddrFrom string }

우리의 블록체인은 단 하나의 버전만 가지기 때문에 Version 필드는 중요하지 않다. BestHeight는 노드가 가진 블록체인의 길이를 저장한다. AddrFrom은 전송자의 주소를 저장한다.

version 메시지를 받은 노드는 무엇을 해야할까? 이 노드는 자신의 version 메시지로 응답한다. 이는 핸드셰이크의 일종으로 서로간 인사말 메시지를 주고받기 전까진 상호작용을 할 수 없다. 이는 단순히 공손함을 표현하는게 아니다. version은 더 긴 블록체인을 찾는데 사용된다. 노드가 version 메시지를 받으면 이는 자신이 가진 블록체인이 BestHeight보다 더 긴지 확인한다. 더 짧은 경우, 노드는 누락된 블록을 요청하여 다운로드 받는다.

메시지를 받으려면 서버가 필요하다.

var nodeAddress string var knownNodes = [] string { “localhost:3000” } func StartServer ( nodeID , minerAddress string ) { nodeAddress = fmt . Sprintf ( “localhost:%s” , nodeID ) miningAddress = minerAddress ln , err := net . Listen ( protocol , nodeAddress ) defer ln . Close () bc := NewBlockchain ( nodeID ) if nodeAddress != knownNodes [ 0 ] { sendVersion ( knownNodes [ 0 ], bc ) } for { conn , err := ln . Accept () go handleConnection ( conn , bc ) } }

먼저 중앙 노드의 주소를 하드코딩한다. 모든 노드는 처음에 연결할 노드를 알아야한다. minerAddress 인자는 채굴 보상을 받을 주소를 지정한다.

if nodeAddress != knownNodes [ 0 ] { sendVersion ( knownNodes [ 0 ], bc ) }

현재 노드가 중앙 노드가 아니면 자신의 블록체인이 최신 데이터인지 확인하기위해 중앙 노드에 version 메시지를 전송해야한다.

func sendVersion ( addr string , bc * Blockchain ) { bestHeight := bc . GetBestHeight () payload := gobEncode ( version { nodeVersion , bestHeight , nodeAddress }) request := append ( commandToBytes ( “version” ), payload … ) sendData ( addr , request ) }

메시지는 로우 레벨에서 보면 바이트의 시퀀스이다. 첫 12 바이트는 커맨드명 (여기선 “version”)을 나타내며 이어지는 바이트는 gob으로 인코딩된 메시지 구조체이다. commandToBytes는 다음과 같이 구현한다.

func commandToBytes ( command string ) [] byte { var bytes [ commandLength ] byte for i , c := range command { bytes [ i ] = byte ( c ) } return bytes [:] }

이 함수는 12 바이트의 버퍼를 만들어 커맨드명을 채워넣은 뒤 나머지 바이트는 빈 상태 그대로 둔다. 반대로 바이트 시퀀스를 커맨드로 변환하는 함수도 있다.

func bytesToCommand ( bytes [] byte ) string { var command [] byte for _ , b := range bytes { if b != 0x0 { command = append ( command , b ) } } return fmt . Sprintf ( “%s” , command ) }

노드가 커맨드를 수신하면, bytesToCommand를 통해 커맨드명을 가져와 적절한 핸들러로 커맨드 내용을 처리한다.

func handleConnection ( conn net . Conn , bc * Blockchain ) { request , err := ioutil . ReadAll ( conn ) command := bytesToCommand ( request [: commandLength ]) fmt . Printf ( “Received %s command

” , command ) switch command { … case “version” : handleVersion ( request , bc ) default : fmt . Println ( “Unknown command!” ) } conn . Close () }

version 커맨드 핸들러는 다음과 같다.

func handleVersion ( request [] byte , bc * Blockchain ) { var buff bytes . Buffer var payload version buff . Write ( request [ commandLength :]) dec := gob . NewDecoder ( & buff ) err := dec . Decode ( & payload ) myBestHeight := bc . GetBestHeight () foreignerBestHeight := payload . BestHeight if myBestHeight < foreignerBestHeight { sendGetBlocks ( payload . AddrFrom ) } else if myBestHeight > foreignerBestHeight { sendVersion ( payload . AddrFrom , bc ) } if ! nodeIsKnown ( payload . AddrFrom ) { knownNodes = append ( knownNodes , payload . AddrFrom ) } }

우선 요청을 디코딩하여 페이로드를 가져온다. 이는 모든 핸들러의 공통사항이므로, 앞으로 작성할 코드 스니펫에서 이 코드는 생략할 것이다.

그 다음 노드는 자신의 BestHeight와 메시지에서 받은 값을 비교한다. 노드가 가진 블록체인이 더 길면 version 메시지로 회신하며, 짧으면 getblocks 메시지를 전송한다.

getblocks

type getblocks struct { AddrFrom string }

getblocks는 “네가 가지고 있는 블록을 보여줘”라는 의미를 지닌다 (비트코인에서는 좀 더 복잡하다). 이는 모든 블록들을 가져오는게 아닌 블록들의 해시 리스트를 요청하는것임에 주의해야한다. 이는 네트워크 로드를 낮추기 위함인데 블록들은 다른 노드들에서도 가져올 수 있으므로, 한 노드에서 수십 기가바이트에 해당하는 블록들을 다운로드할 필요는 없기 때문이다.

커맨드 처리는 아주 쉽다.

func handleGetBlocks ( request [] byte , bc * Blockchain ) { … blocks := bc . GetBlockHashes () sendInv ( payload . AddrFrom , “block” , blocks ) }

우리의 간소화된 구현에서 이는 모든 블록의 해시를 반환한다.

inv

type inv struct { AddrFrom string Type string Items [][] byte }

비트코인은 inv를 사용해 현재 노드가 가진 블록 및 트랜잭션을 다른 노드에 표시한다. 다시 말하지만, 이는 전체 블록과 트랜잭션이 아니라 그저 블록과 트랜잭션의 해시값만 포함하고있다.

inv 처리는 조금 복잡하다.

func handleInv ( request [] byte , bc * Blockchain ) { … fmt . Printf ( “Received inventory with %d %s

” , len ( payload . Items ), payload . Type ) if payload . Type == “block” { blocksInTransit = payload . Items blockHash := payload . Items [ 0 ] sendGetData ( payload . AddrFrom , “block” , blockHash ) newInTransit := [][] byte {} for _ , b := range blocksInTransit { if bytes . Compare ( b , blockHash ) != 0 { newInTransit = append ( newInTransit , b ) } } blocksInTransit = newInTransit } if payload . Type == “tx” { txID := payload . Items [ 0 ] if mempool [ hex . EncodeToString ( txID )]. ID == nil { sendGetData ( payload . AddrFrom , “tx” , txID ) } } }

블록 해시값들을 전달받으면 다운로드한 블록을 추적하기 위해 blocksInTransit 변수에 저장한다. 이렇게 하면 다른 노드에서 블록을 다운로드 할 수 있다. 블록을 전송 상태로 전환한 직후에 inv 메시지를 보낸 노드에게 getdata 커맨드를 전송하고 blockInTransit을 갱신한다. 실제 P2P 네트워크에서는 메시지를 보낸 노드만이 아니라 서로 다른 노드에서 블록을 전송하려고 한다.

우리의 구현에서는 inv에 다중 해시를 전송하지 않는다. 이게 **payload.Type == “tx”**에서 첫 해시만 취해 검사하는 이유이다. mempool에 해시가 존재하는지 확인한 뒤, 없으면 getdata 메시지를 전송한다.

getdata

type getdata struct { AddrFrom string Type string ID [] byte }

getdata는 특정 블록 및 트랜잭션에 대한 요청이며, 단 하나의 블록 및 트랜잭션의 ID만을 포함할 수 있다.

func handleGetData ( request [] byte , bc * Blockchain ) { … if payload . Type == “block” { block , err := bc . GetBlock ([] byte ( payload . ID )) sendBlock ( payload . AddrFrom , & block ) } if payload . Type == “tx” { txID := hex . EncodeToString ( payload . ID ) tx := mempool [ txID ] sendTx ( payload . AddrFrom , & tx ) } }

요청이 블록이면 블록을, 트랜잭션이면 트랜잭션을 반환한다. 노드가 블록 또는 트랜잭션을 가지고 있는지 확인하는 과정이 없는데 이는 결함이다.

block과 tx

type block struct { AddrFrom string Block [] byte } type tx struct { AddrFrom string Transaction [] byte }

실제로 데이터를 전달하는 메시지 구조체이다.

block 메시지 처리는 쉽다.

func handleBlock ( request [] byte , bc * Blockchain ) { … blockData := payload . Block block := DeserializeBlock ( blockData ) fmt . Println ( “Received a new block!” ) bc . AddBlock ( block ) fmt . Printf ( “Added block %x

” , block . Hash ) if len ( blocksInTransit ) > 0 { blockHash := blocksInTransit [ 0 ] sendGetData ( payload . AddrFrom , “block” , blockHash ) blocksInTransit = blocksInTransit [ 1 :] } else { UTXOSet := UTXOSet { bc } UTXSOSet . Reindex () } }

새로운 블록을 받으면 자신의 블록체인에 추가한다. 다운로드할 블록이 더 있다면 이전 블록을 다운로드 받은 동일한 노드에게 블록을 요청한다. 블록이 모두 다운로드되면 UTXO 집합의 재색인이 이루어진다.

TODO: 무조건 신뢰하는 대신, 블록체인에 추가하기 전에 수신하는 모든 블록의 유효성을 검사해야한다. TODO: 블록체인이 크기 때문에 UTXOSet.Reindex() 대신 UTXOSet.Update(block)을 사용해야한다. 전체 UTXO 집합을 재색인하는데에는 아주 많은 시간이 소요된다.

tx 메시지 처리는 조금 복잡하다.

func handleTx ( request [] byte , bc * Blockchain ) { … txData := payload . Transaction tx := DeserializeTransaction ( txData ) mempool [ hex . EncodeToString ( tx . ID )] = tx if nodeAddress == knownNodes [ 0 ] { for _ , node := range knownNodes { if node != nodeAddress && node != payload . AddrFrom { sendInv ( node , “tx” , [][] byte { tx . ID }) } } } else { if len ( mempool ) >= 2 && len ( miningAddress ) > 0 { MineTransactions : var txs [] * Transaction for id := range mempool { tx := mempool [ id ] if bc . VerifyTransaction ( & tx ) { txs = append ( txs , & tx ) } } if len ( txs ) == 0 { fmt . Println ( “All transactions are invalid! Waiting for new ones…” ) return } cbTx := NewCoinbaseTX ( miningAddress , “” ) txs = append ( txs , cbTx ) newBlock := bc . MineBlock ( txs ) UTXOSet := UTXOSet { bc } UTXOSet . Reindex () fmt . Println ( “New block is mined!” ) for _ , tx := range txs { txID := hex . EncodeToString ( tx . ID ) delete ( mempool , txID ) } for _ , node := range knownNodes { if node != nodeAddress { sendInv ( node , “block” , [][] byte { newBlock . Hash }) } } if len ( mempool ) > 0 { goto MineTransactions } } } }

처음에 할 일은 새로운 트랜잭션을 mempool에 추가하는 것이다 (다시 말하지만, 트랜잭션은 mempool에 추가되기 전에 반드시 검증되어야한다). 다음 코드를 살펴보자.

if nodeAddress == knownNodes [ 0 ] { for _ , node := range knownNodes { if node != nodeAddress && node != payload . AddFrom { sendInv ( node , “tx” , [][] byte { tx . ID }) } } }

현재 노드가 중앙 노드인지를 확인한다. 우리의 구현체에서 중앙 노드는 블록을 채굴하지 않는다. 대신 새로운 트랜잭션을 네트워크상의 다른 노드들에게 전달해준다.

그 다음 코드는 채굴자 노드에만 해당한다. 각 부분별로 살펴보자.

if len ( mempool ) >= 2 && len ( miningAddress ) > 0 {}

miningAddress은 채굴자 노드에만 있다. 현재 (채굴자) 노드의 mempool에 두 개 이상의 트랜잭션이 있을때 채굴을 시작한다.

for id := range mempool { tx := mempool [ id ] if bc . VerifyTransaction ( & tx ) { txs = append ( txs , & tx ) } } if len ( txs ) == 0 { fmt . Println ( “All transactions are invalid! Waiting for new ones…” ) return }

먼저 mempool의 모든 트랜잭션이 검증된다. 유효하지 않은 트랜잭션은 무시되며, 유효한 트랜잭션이 없는 경우 채굴은 중단된다.

cbTx := NewCoinbaseTX ( miningAddress , “” ) txs = append ( txs , cbTx ) newBlock := bc . MineBlock ( txs ) UTXOSet := UTXOSet { bc } UTXOSet . Reindex () fmt . Println ( “New block is mined!” )

검증된 트랜잭션은 보상을 가진 코인베이스 트랜잭션과 함께 블록에 추가된다. 블록 채굴이 끝나면 UTXO 집합은 재색인된다.

TODO: 마찬가지로, UTXOSet.Reindex 대신 UTXOSet.Update를 사용하는게 더 좋다.

for _ , tx := range txs { txID := hex . EncodeToString ( tx . ID ) delete ( mempool , txID ) } for _ , node := range knownNodes { if node != nodeAddress { sendInv ( node , “block” , [][] byte { newBlock . Hash }) } } if len ( mempool ) > 0 { goto MineTransactions }

트랜잭션은 채굴된 후 mempool에서 제거된다. 현재 노드가 알고있는 모든 노드들은 새로운 블록 해시가 담긴 inv 메시지를 받는다. 이 노드들은 메시지를 처리한 후에 블록을 요청할 수 있다.

결과

앞에서 정의했던 시나리오를 시연해보자.

먼저 첫 번째 터미널에서 NODE_ID를 3000으로 설정 (export NODE_ID=3000)한다. 커맨드를 실행하는 노드를 알 수 있도록 설명하기 전마다 NODE 3000이나 NODE 3001과 같이 표시를 해두겠다.

NODE 3000

지갑과 블록체인을 생성하자.

$ blockchain_go createblockchain -address CENTRAL_NODE

(간결한 설명을 위해 가짜 주소를 사용하겠다)

커맨드 실행이 끝나면 블록체인은 하나의 제네시스 블록을 갖게될 것이다. 그 다음 다른 노드에서 사용할 수 있도록 블록을 저장해야한다. 제네시스 블록은 블록체인의 식별자로 사용된다 (비트코인의 제네시스 블록은 하드코딩 되어있다).

$ cp blockchain_3000.db blockchain_genesis.db

NODE 3001

다음으로, 새 터미널을 열어 노드 ID를 3001로 설정한다. 이는 지갑 노드이다. blockchain_go createwallet으로 몇 개의 주소를 생성해 각 주소를 WALLET_1, WALLET_2, WALLET_3라고 부르자.

NODE 3000

지갑 주소로 코인을 전송해보자.

$ blockchain_go send -from CENTREAL_NODE -to WALLET_1 -amount 10 -mine $ blockchain_go send -from CENTREAL_NODE -to WALLET_2 -amount 10 -mine

-mine 플래그는 블록이 전송 노드에 의해 즉시 채굴됨을 의미한다. 초기에는 네트워크에 채굴자 노드가 없기 때문에 이 플래그를 사용해야한다. 이제 노드를 실행해보자.

$ blockchain_go startnode

이 노드는 반드시 시나리오가 끝날때까지 계속 실행되어야 한다.

NODE 3001

위에서 저장한 제네시스 블록으로 노드의 블록체인을 시작한다.

$ cp blockchain_genesis.db blockchain_3001.db

노드를 실행하자.

$ blockchain_go startnode

이 노드는 중앙 노드로부터 모든 블록을 다운로드 받는다. 잘 동작하는지 확인하기 위해 노드를 중지하고 잔고를 확인해보자.

$ blockchain_go getbalance -address WALLET_1 Balance of ‘WALLET_1’: 10 $ blockchain_go getbalance -address WALLET_2 Balance of ‘WALLET_2’: 10

3001 노드는 이제 자체 블록체인을 가지고 있기 때문에 CENTRAL_NODE 주소의 잔고도 확인할 수 있다.

$ blockchain_go getbalance -address CENTRAL_NODE Balance of ‘CENTRAL_NODE’: 10

NODE 3002

새 터미널을 열어 노드 ID를 3002로 설정하고 지갑을 생성한다. 이는 채굴자 노드이다. 블록체인을 초기화하자.

$ cp blockchain_genesis.db blockchain_3002.db

노드를 실행하자.

$ blockchain_go startnode -miner MINER_WALLET

NODE 3001

코인을 전송해보자.

$ blockchain_go send -from WALLET_1 -to WALLET_3 -amount 1 $ blockchain_go send -from WALLET_2 -to WALLET_4 -amount 1

NODE 3002

채굴자 노드로 전환하면 새로운 블록을 채굴하는걸 볼 수 있을 것이다. 그리고 중앙 노드의 출력을 확인해보아라.

NODE 3001

지갑 노드로 전환하고 노드를 실행하자.

$ blockchain_go startnode

노드를 실행하면 새로 채굴된 블록을 다운로드할 것이다.

노드를 중지하고 잔고를 확인해보자.

$ blockchain_go getbalance -address WALLET_1 Balance of ‘WALLET_1’: 9 $ blockchain_go getbalance -address WALLET_2 Balance of ‘WALLET_2’: 9 $ blockchain_go getbalance -address WALLET_3 Balance of ‘WALLET_3’: 1 $ blockchain_go getbalance -address WALLET_4 Balance of ‘WALLET_4’: 1 $ blockchain_go getbalance -address MINER_WALLET Balance of ‘MINER_WALLET’: 10

다 되었다!

결론

드디어 시리즈가 끝났다. P2P 네트워크의 실제 프로토타입을 구현하는 포스트를 더 작성하고 싶었지만 시간이 부족했다. 이 시리즈로 비트코인 기술에 대한 질문에 답을 얻고 새로운 질문을 제기하여 여러분 스스로가 답을 할 수 있기를 바란다. 비트코인 기술에는 더 많은 흥미로운 주제들이 숨겨져 있다! 행운을 빈다!

P.S 비트코인 네트워크 프로토콜에 설명되어 있는 addr 메시지를 구현함으로써 네트워크를 개선해볼 수 있다. 이는 노드들이 서로를 탐색할 수 있도록 만들어주기 때문에 아주 중요하다. 필자 또한 구현중이지만 아직 완성되진 않았다.

링크:

간단한 블록체인을 구현해보며 이해하기

반응형

블록체인이라고 하면 비트코인이나 이더리움을 떠올릴 수 있겠지만, 이것은 암호화폐(Cryptocurrency)로 분류할 수 있습니다. 암호화폐를 이루는 기술들은 다양합니다. 블록체인은 그 기술 중 일부인 셈입니다.

그렇게 분리해서 생각한다면 블록체인만 따로 떼어내서 이해해 볼 수도 있으며 이를 작은 모형부터 직접 구현해 보면 그 실체를 훨씬 이해하기 쉽다고 생각합니다. 초보개발자를 위해 쉬운 개념부터 접근해 보겠습니다.

블록과 체인

블록과 체인을 하나씩 코드로 구현한다면 무엇으로 표현 할 수 있을까요?

블록 – 관리 대상 데이터

체인 – 데이터간 연결

처음 이 개념을 접했을 때 블록은 구조체(혹은 객체)로, 체인은 링크드 리스트 같은 참조를 떠올렸습니다. 그렇다면 링크드 리스트(흔히 Singly list) 같은 형태가 떠올랐습니다.

단순한 링크드 리스트 모습

블록체인도 단순하게 그림으로 표현한다면 사실 거의 흡사합니다. 다만 포인터 참조가 아닌 해시값 참조로 연결되어 있으며 해시를 이해해야 합니다.

블록해시

여기서의 해시는 해시함수를 의미하며 위키 정의를 살펴보면,

해시함수란 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.

라고 정의되어 있습니다. 해시함수는 아래와 같은 특성이 있습니다.

어떠한 값을 입력값으로 주어도 비슷한 길이의 알 수 없는 난수가 결과로 출력된다. 입력 데이터가 한 글자만 바뀌어도 완전히 다른 결과가 출력된다. 출력 값으로 입력값을 예측할 수 없다. 같은 내용으로 입력값을 주면 결과값은 항상 같다.

블록에는 어떤 데이터를 담고 있을 것이며 이것을 해싱하면 고정된 길이의 해시값이 출력이 될 것입니다.

블록 구현

블록은 구조체로 표현될 수 있습니다. 그렇다면 어떤 변수들을 담으면 될까요? 현재는 이해를 돕기 위해 가장 단순한 모델을 가정해보겠습니다.

이전 블록의 해시값을 기억할 변수 현재 블록에서 간직해야 할 데이터

체인 구현

블록을 생성하였다면 직전에 만든 블록과 관계를 맺어줘야 합니다. 블록체인에서는 이전의 블록 해시값을 그다음 블록이 기억을 해주고 이런 과정을 반복적으로 해주는 관계를 블록체인이라고 합니다.

단 하나, 예외적인 경우라면 최초의 블록입니다. 이때는 이전의 블록이 존재하지 않기에 해시값을 없거나 무의미한 랜덤 값을 넣어줍니다. 이후의 생성될 블록체인 생성과정속에 씨앗을 만드는 것으로 볼 수 있으며 이런 최초의 블록은 Genesis 블록이라고 부릅니다.

작업 증명(Proof of Work)

블록체인과 링크드 리스트와 다른 점은 크게는 연결관계에 있습니다. 총 3개의 블록이 생성된 블록체인을 가정해보겠습니다.

3개의 블록체인

2번째 블록의 해시값은 6BQ1이며 다음번 블록에서 기억하고 있습니다. 하지만 2번째 블록에서 누군가가 수정을 가한다면 3번째 블록에서 기억하고 있는 이전 해시값은 변경이 필요해집니다. 그렇다면 3번 블록의 해시값 자체도 변경이 되기에 이후에 블록이 있다면 모두 한 땀 한 땀 수정이 이루어져야 합니다. 바로 이런 점이 링크드 리스트와 다른 개념입니다.

하지만 사람이 수정하는 것도 아니고 컴퓨터가 해줄 건데 그게 뭐가 대수냐 할 수도 있습니다. 그렇다면 컴퓨터에게도 조금은 시간이 걸리게끔 작업을 주도록 해보겠습니다.

Nonce

컴퓨터에게 작업을 준다? 그래서 시간을 지연시키게끔 한다? 시간 지연은 어려운 일이 아니지만 지연 자체도 의미가 있게끔 해야 합니다. 그래서 보통 사용하는 방법은 해시값을 어차피 구할 거면 앞에 “0”으로 시작하는 해시값을 구하도록 유도하는 것입니다. 하지만 아무리 해시값이 랜덤처럼 보인다 해도 0으로 시작한다는 보장은 없습니다. 이럴 때 입력값을 조금씩 변경시키면서 0으로 시작할 때까지 루프를 돌면서 해시값을 구하도록 합니다. 이렇게 조금씩 변경시키는 차이? 값을 Nonce라고 합니다.

결국 이렇게 nonce를 변경하면서 최종 해시를 구하는 것을 작업 증명이라고 합니다. 일종의 숙제 결과물 같은 값입니다. 이 값이 적절한지는 해시값을 구할 때만큼 오래 걸리지 않습니다. nonce값을 넣고 바로 해시값을 구해서 일치하면 증명이 바로 되는 것이지요. 다만 이 값을 구할 때까지는 nonce를 얼마큼 변경해야 할지 알 수 없기에 한 땀 한 땀 루프 속에서 찾아야만 합니다.

결론

블록체인이 곧 암호화폐는 아닙니다. 저는 현재까지 블록체인을 활용하여 구현한 것 중 가장 성공모델이 암호화폐라고 생각합니다. 비트코인과 이더리움은 투기성을 떠나 아직까지는 생존하는 프로젝트이기 때문입니다. 암호화폐가 아닌 다른 경우에서는 계속하여 아이디어를 실현해보려고 도전하고 있는 단계입니다.

블록체인은 이 외에도 뒷받침 되어야 할 기술들이 상당히 많습니다. 그래서 처음 이 기술에 진입하시려는 분들에게는 좋은 진입점이 되기 위해 가장 단순한 뼈대 기술을 구현해보면서 타 기술들의 필요성을 이해한다면 충분히 빠르게 이해할 수 있으리라 생각합니다.

위의 내용을 구현한 간단한 코드는 파이썬과 자바로 작성해보았습니다. 참고하시면 되겠습니다.

class Block(): def __init__(self, data, prevhash=”): self.data = data self.prevhash = prevhash self.nonce = 0 self.hash = self.calc_hash() def calc_hash(self): block_string = (self.prevhash + str(self.data) + str(self.nonce)).encode() return hashlib.sha256(block_string).hexdigest() def mine_block(self): while self.hash[:5] != str(”).zfill(5): self.nonce += 1 self.hash = self.calc_hash() def __str__(self): string = “nonce: ” + str(self.nonce) + ‘

‘ string += “data: ” + str(self.data) + ‘

‘ string += “prevhash: ” + str(self.prevhash) + ‘

‘ string += “hash: ” + str(self.hash) return string class BlockChain(): def __init__(self): genesis_block = self.generate_genesis_block() self.chain = [genesis_block, ] print(genesis_block) print() @staticmethod def generate_genesis_block(): return Block(‘Genesis Block’) def get_last_block(self): return self.chain[-1] def add_block(self, new_block): new_block.prevhash = self.get_last_block().hash new_block.mine_block() self.chain.append(new_block) print(new_block) print() if __name__ == “__main__”: simple_blockchain = BlockChain() simple_blockchain.add_block(Block(‘2nd’)) simple_blockchain.add_block(Block(‘3rd’))

class Block { private String previousHash; private String data; private int nonce; private String hash; static public MessageDigest messageDigest; static { try { messageDigest = MessageDigest.getInstance(“SHA-256”); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); System.exit(-1); } } public Block(String previousHash, String data) { this.previousHash = previousHash; this.data = data; nonce = 0; calculateHash(); } // 일부 get/set 함수들 … public String getHash() { return hash.toLowerCase(); } public void setPreviousHash(String previousHash) { this.previousHash = previousHash; } public String toBlock() { return getPreviousHash() + getData() + getNonce(); } public String toString() { return “nonce : ” + getNonce() + ‘

‘ + “data : ” + getData() + ‘

‘ + “previousHash : ” + getPreviousHash() + ‘

‘ + “hash : ” + getHash(); } public void calculateHash() { final byte[] bytes = messageDigest.digest(toBlock().getBytes()); setHash(byteArrayToHexString(bytes)); } public void mineBlock() { while (!getHash().startsWith(“00000”)) { setNonce(getNonce() + 1); calculateHash(); } } public static String byteArrayToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format(“%02X”, b & 0xff)); } return sb.toString(); } } class BlockChain { private List blocks = new ArrayList<>(); public BlockChain() { blocks.add(new Block(“”, “Genesis Block”)); System.out.println(blocks.get(0) + ”

“); } public void addBlock(Block block) { block.setPreviousHash(blocks.get(blocks.size() – 1).getHash()); block.mineBlock(); blocks.add(block); System.out.println(block + ”

“); } } public class SimpleBlockChain { public static void main(String[] args) { BlockChain blockChain = new BlockChain(); blockChain.addBlock(new Block(“”, “2nd”)); blockChain.addBlock(new Block(“”, “3rd”)); } }

[특허]블록체인 구현 방법 및 시스템

초록

본 발명은 컴퓨터 기반의 전자 원장(ledgers), 특히 “블록체인 (blockchains)”으로 알려진 분산형 원장에 관한 것이다. 본 발명은 비트코인(Bitcoin) 블록체인 및 관련 프로토콜과 함께 사용하기에 적합하지만, 이에 국한되지 않고 다른 블록체인 플랫폼을 사용할 수도 있다. 본 발명은 블록체인으로 제출될 필요가 있는 트랜잭션(TXs)의 수가 크게 감소될 수 있는 소액 결제 채널(micropayment channel)을 실행하기 위한 새롭고 유리한 기술을 제공한다. 초기 트랜잭션 (Tx)은 선택된 트랜잭션이 완료(서명)되고 네트워크에 제출될 때까지 다른 당사자가 보유할 수 있는 하나 이상…

본 발명은 컴퓨터 기반의 전자 원장(ledgers), 특히 “블록체인 (blockchains)”으로 알려진 분산형 원장에 관한 것이다. 본 발명은 비트코인(Bitcoin) 블록체인 및 관련 프로토콜과 함께 사용하기에 적합하지만, 이에 국한되지 않고 다른 블록체인 플랫폼을 사용할 수도 있다. 본 발명은 블록체인으로 제출될 필요가 있는 트랜잭션(TXs)의 수가 크게 감소될 수 있는 소액 결제 채널(micropayment channel)을 실행하기 위한 새롭고 유리한 기술을 제공한다. 초기 트랜잭션 (Tx)은 선택된 트랜잭션이 완료(서명)되고 네트워크에 제출될 때까지 다른 당사자가 보유할 수 있는 하나 이상의 후속 트랜잭션으로 대체될 수 있다. 한 실시예에서, 본 발명은 블록체인을 통해 교환을 수행하는 컴퓨터 구현 방법을 제공하며, 이는 블록체인 네트워크에 자금 제공(funding) 트랜잭션을 제출하는 단계를 포함하며, 여기서 펀딩 트랜잭션은 제 2 사용자로부터 제 1 사용자로 전송될 자산에 관한 토큰화 된 계약을 포함하고; ii) 제1 사용자에 의하여 서명된다. 또한, 이는 제 1 사용자로부터 제 2 사용자에게 하나 이상의 후속 트랜잭션을 전송하는 단계를 포함하고, 여기서 후속 트랜잭션 각각은 펀딩 트랜잭션의 출력을 소비하고 제 1 사용자에 의해 서명된다. 이는 후속 트랜잭션들 중 하나를 블록체인 네트워크에 제출하는 단계를 포함하며, 제출된 트랜잭션은 제2 사용자에 의하여 서명된다.

블록체인 기술이란 무엇인가요? 최종 설명

챕터

챕터 1 – 블록체인 101

목차

블록체인이란 무엇인가요?

블록체인은 특별한 형태의 데이터베이스입니다. 여러분은 분산 원장 기술(DLT)에 들어보셨을 수 있는데, 이는 동일한 것을 지칭하는 말입니다.

블록체인에는 고유한 특성들이 존재합니다. 데이터가 추가되는 규칙이 존재하며, 데이터가 저장된 다음부터는 이를 수정하거나 삭제하는 것이 실질적으로 불가능합니다.

데이터는 시간에 따라 블록 이라 하는 구조 안에 저장됩니다. 각 블록은 마지막 블록 위에 생성되며 이전 블록과 연결되는 정보 조각을 포함하고 있습니다. 가장 최신의 블록을 살펴보면, 우리는 이것이 마지막 블록 다음에 생성된 것을 확인할 수 있습니다. 우리가 이를 계속해 “체인” 가장 아래로 내려 간다면, 가장 처음의 블록에 도달할 것이며, 이를 제네시스 블록(genesis block) 이라 합니다.

비유를 위해 여러분이 두 개의 열이 있는 스프레드시트를 갖고 있다고 가정해보겠습니다. 첫 번째 열의 첫 칸에는 기록하고자 하는 어떤 데이터든 입력할 수 있습니다.

첫 번째 칸의 데이터는 두 개의 문자로 된 식별자로 치환되며, 이는 다음 입력값의 일부로 사용될 것입니다. 아래의 예시에서는, 두 번째 열의 다음 칸(defKP)을 채우기 위해 KP라는 두 개의 문자 식별자가 반드시 사용되어야 합니다. 이는 여러분이 첫 번째 입력 데이터(abcAA)를 변경하면, 모든 칸에 다른 조합의 문자가 생성된다는 것을 의미합니다.

각 항목이 마지막 것과 연결되어 있는 데이터베이스

이제 4번째 열에서는 가장 최신의 식별자 TH를 볼 수 있습니다. 각 항목을 되돌리거나 제거, 또는 삭제할 수 없다고 말했던 것을 기억하시나요? 이는 이러한 과정이 진행되었다는 것을 누구나 쉽게 말할 수 있으며, 따라서 이를 변경하려는 시도가 무산될 것이기 때문입니다.

여러분이 첫 번째 칸의 데이터를 변경하려 한다고 해보겠습니다. 여러분은 다른 식별자를 얻게 될 것이며, 두 번째 블록은 다른 데이터를 갖게 될 것이고, 이는 두 번째 열에 다른 식별자를 생성할 것입니다. 기본적으로 TH는 전에 있던 모든 정보에서 비롯된 결과인 것입니다.

블록들은 어떻게 연결되나요?

앞서 우리가 논의했던, 두 개의 문자 식별자는 블록체인이 사용하는 해시 함수 를 간단히 비유한 것이었니다. 해싱은 두 블록을 함께 이어붙이는 접착제 같은 것입니다. 이는 모든 크기의 데이터를 수학적 함수에 통과 시켜 언제나 동일한 길이의 출력값( 해시 )을 산출하는 과정으로 구성됩니다.

블록체인에서 사용되는 해시는 흥미로운 것인데, 정확히 같은 출력값을 출력하는 두 데이터 조각을 찾을 가능성은 천문학적으로 낮습니다. 위의 식별자와 같이, 입력값을 아주 조금 수정해도 완전히 다른 출력값을 얻게될 것입니다.

비트코인에서 널리 사용되는 함수인 SHA256으로 설명해 보겠습니다. 아래에서 보듯, 문자를 대문자로 바꾸기만 해도 출력값은 완전히 뒤바뀝니다.

입력 데이터 SHA256 출력값 Binance Academy 886c5fd21b403a139d24f2ea1554ff5c0df42d5f873a56d04dc480808c155af3 Binance academy 4733a0602ade574551bf6d977d94e091d571dc2fcfd8e39767d38301d2c459a7 binance academy a780cd8a625deb767e999c6bec34bc86e883acc3cf8b7971138f5b25682ab181

SHA 256 충돌에 대해서는 알려진 바가 없으며(예를 들어 서로 다른 입력값이 동일한 출력값을 산출하는 것과 같은), 이는 블록체인 관점에서 상당히 소중한 것입니다. 이는 각 블록이 이전 블록의 해시를 포함하고 이를 가리킬 수 있음을 의미하며, 이전 블록을 수정하려는 모든 시도를 즉시 알아챌 수 있다는 것을 뜻합니다.

각 블록은 이전 블록의 지문을 포함

블록체인과 탈중앙화

우리는 블록체인의 기본 구조에 대해 설명했습니다. 그런데 사람들은 블록체인 기술에 대해 이야기할 때, 단지 데이터베이스에 대해서만 이야기하는 것이 아니라 블록체인 주변에 형성된 생태계에 대해서도 이야기 합니다.

독립적인 데이터 구조로써 블록체인은 특정 애플리케이션에 무척이나 유용한 것입니다. 낯선 이들과 협력하는 데 블록체인을 사용한다면 무척 흥미로울 것입니다. 다른 기술과 일부 게임 이론 을 조합하면, 블록체인은 누구에게도 통제되지 않는 분산화된 원장 역할을 할 수 있습니다.

이는 시스템 규칙 밖에서 해당 입력값을 수정할 수 있는 권한을 누구도 갖고 있지 않다는 의미입니다. 따라서 여러분은 이러한 원장을 모두가 동시에 소유하고 있다고 주장할 수 있으며, 참가자들은 특정 순간의 원장 상태에 동의하게 됩니다.

비잔틴 장군 문제

앞서 기술한 것과 같은 시스템을 가로 막고 있는 도전 과제들을 비잔틴 장군 문제 라고 합니다. 이는 1980년대에 구상된 것으로 고립되어 있는 참여자들이 자신의 행동을 조율하기 위해 반드시 커뮤니케이션을 해야 한다는 딜레마를 설명 하기 위한 것이었습니다. 해당 딜레마에는 도시를 둘러싸고 어디를 공격해야 할지 결정해야 하는 몇 장군들이 존재합니다. 장군들은 메시지 전달자를 통해서만 의사소통할 수 있습니다.

각 장군은 공격 혹은 후퇴를 결정해야 합니다. 공격 또는 후퇴 중 무엇이라도 상관없으며, 모든 장군들이 동일한 결정에 동의하기만 하면 됩니다. 만약 장군들이 공격을 결정한다면, 동시에 움직여야만 성공할 것입니다. 그렇다면 우리는 이를 어떻게 성사시킬 수 있을까요?

우리는 물론 메시지 전달자를 통해 의사소통할 수 있습니다. 하지만 메시지 전달자가 “새벽에 공격한다”는 메시지를 중간에 가로채고, “우리는 오늘 밤 공격한다”로 메시지를 바꾸면 어떡할까요? 만약 한 장군이 나쁜 마음을 먹고 의도적으로 다른 이들이 패배하게 만들면 어떡할까요?

모든 장군이 공격에 성공(왼쪽). 다른 이들이 공격하는 동안 일부가 후퇴할 경우, 장군들은 패배(오른쪽).

우리에게는 참여자가 악의를 품거나 메시지가 가로막히더라도 합의에 도달할 수 있는 전략이 필요합니다. 데이터베이스를 유지하지 못하는 것은 증원군 없이 도시를 공격하는 것처럼 생사를 가르는 문제는 아니지만, 여기에는 동일한 원칙이 적용됩니다. 만약 블록체인을 감독하는 이들이 없고, 사용자에게 “정확한” 정보를 제공하지 않는다면, 사용자는 자신들 사이에서 의사소통할 수 있어야 합니다.

한 사용자(혹은 여러)의 잠재적 실패를 극복하기 위해, 블록체인의 메커니즘은 이러한 차질을 견뎌낼 수 있게끔 섬세하게 설계되어야 합니다. 이를 이뤄낼 수 있는 시스템을 비잔틴 장애 허용이라고 합니다. 이후 간략하게 살펴볼 것이지만, 강력한 규칙을 시행하기 위해 합의 알고리즘 이 사용됩니다.

블록체인이 탈중앙화되어야 하는 이유는 무엇인가요?

여러분은 물론 자신만의 블록체인을 운영할 수 있습니다. 그러나 더 나은 다른 것들과 비교할 때 결국 한물 간 데이터베이스가 될 것입니다. 모든 사용자가 동등한 블록체인의 진정한 잠재력은 탈중앙화된 환경에서 활용될 수 있습니다. 따라서 블록체인은 삭제되거나 악의적으로 장악될 수 없습니다. 이는 누구나 볼 수 있는 하나의 사실 자료입니다.

피어투피어 네트워크란 무엇인가요?

피어투피어(P2P) 네트워크 는 사용자들의 레이어입니다(또는 이전 예시에서는 장군들). 관리자가 없으며 따라서 중앙 서버에 연락하지 않고, 사용자들은 다른 사용자와 정보를 언제나 교환할 수 있으며, 이를 다른 피어에게 직접 전송할 수 있습니다.

아래 그림을 살펴보시기 바랍니다. 왼쪽에서 A는 F에게 연락하기 위해 서버에 메시지를 보내야 합니다. 그러나 오른쪽에서는 중개자 없이 서로가 연결되어 있습니다.

중앙화 네트워크(왼쪽) vs. 탈중앙화 네트워크(오른쪽).

일반적으로 서버는 사용자가 필요한 모든 정보를 보유합니다. 여러분이 바이낸스 아카데미에 접속한다면, 해당 서버에 아티클을 요청하는 것입니다. 웹사이트가 오프라인이 되면, 여러분은 아티클을 보실 수 없습니다. 그러나 여러분이 모든 콘텐츠를 다운로드해 두었다면, 바이낸스 아카데미에 요청을 보내지 않고 여러분의 컴퓨터에서 이를 불러올 수 있습니다.

근본적으로 이것이 블록체인에서 각 피어들이 하는 일입니다. 전체 데이터베이스는 피어들의 컴퓨터에 저장되어 있습니다. 누군가 네트워크를 떠나도, 남은 사용자들은 여전히 블록체인에 접근할 수 있으며, 서로에게 정보를 공유할 수 있습니다. 새로운 블록이 체인에 추가되면, 데이터는 네트워크 전반으로 전파되며, 누구나 자신의 원장 사본을 업데이트할 수 있습니다.

해당 네트워크 유형에 대한 보다 자세한 논의를 확인해보고 싶으시다면 피어투피어 네트워크 설명 을 꼭 확인해보시기 바랍니다.

블록체인 노드란 무엇인가요?

노드는 간단히 말해 네트워크에 접속된 기기를 일컫는 것으로, 블록체인 사본을 저장하고, 다른 기기와 정보를 공유하는 것입니다. 사용자는 해당 과정을 수동으로 처리하지 않아도 됩니다. 일반적으로 사용자는 블록체인 소프트웨어를 다운로드하고 실행하기만 하면 되며, 나머지 일은 알아서 처리될 것입니다.

위의 설명은 노드가 무엇인지에 대한 순전히 이론적인 설명이었으며, 해당 정의에는 네트워크와 어떤 식으로든 상호작용하는 다른 사용자들도 포함됩니다. 예를 들어 암호화폐 에서는 여러분 휴대전화의 간단한 지갑 애플리케이션을 라이트 노드라고 합니다.

퍼블릭 vs. 프라이빗 블록체인

여러분이 알고 있을 것이듯, 비트코인 은 블록체인 업계가 오늘날까지 성장할 수 있는 기반을 마련했습니다. 비트코인은 정당한 금융 자산으로 공급되기 시작했으며, 혁신자들은 기반 기술의 다른 분야에서의 잠재성에 대해 생각해 왔습니다. 이는 금융 영역 바깥의 수 많은 활용 예시들을 위한 블록체인 탐구로 이어졌습니다.

비트코인 은 퍼블릭 블록체인입니다. 이는 누구나 해당 블록체인상의 트랜잭션을 볼 수 있고, 이를 위해서는 인터넷 접속과 필수 소프트웨어만 있으면 된다는 의미입니다. 참여자에게 다른 것들이 요구되지 않기 때문에, 우리는 이를 허가가 필요 없는 환경이라 일컬을 수 있습니다.

반면, 프라이빗 블록체인이라 하는 유형의 블록체인도 있습니다. 해당 시스템은 누가 블록체인을 볼 수 있고, 이와 상호작용할 수 있는지 하는 규칙을 갖고 있습니다. 따라서 우리는 이를 허가받은 환경이라 합니다. 언뜻 보기에 프라이빗 블록체인은 쓸모없어 보일 수 있지만, 주로 기업 환경에서 중요한 애플리케이션입니다.

암호화폐 거래를 생각 중이신가요? 바이낸스에서 비트코인을 구매하세요!

트랜잭션은 어떻게 이뤄지나요?

앨리스가 밥에게 은행을 통해 송금을 하고자 한다면, 앨리스는 이를 자신의 은행에 통보합니다. 예시의 편리성을 위해 두 당사자가 동일한 은행을 사용한다고 가정해 보겠습니다. 은행은 데이터베이스를 업데이트하기 전(예를 들면, 앨리스 -$50, 밥 +$50), 앨리스가 트랜잭션을 수행하기 위한 잔고를 갖고 있는지 확인합니다.

이는 블록체인과 크게 다르지 않습니다. 결국, 블록체인도 하나의 데이터베이스입니다. 핵심적인 차이는 잔고를 확인하고 업데이트하는 단일한 주체가 존재하지 않는다는 것입니다. 노드 전체가 이를 수행해야 합니다.

앨리스가 5개의 비트코인을 밥에게 전송하고자 한다면, 앨리스는 이러한 메시지를 네트워크에 전달합니다. 이는 블록체인에 즉시 추가되지는 않으나, 노드는 이를 보게 될 것이며, 트랜잭션이 승인되기 위해서는 반드시 다른 행동을 완료해야만 합니다. 블록은 어떻게 블록체인에 추가되나요? 를 살펴보시기 바랍니다.

트랜잭션이 블록체인에 추가되면, 모든 노드는 이를 확인할 수 있습니다. 노드는 이를 반영하기 위해 자신의 블록체인 사본에 이를 업데이트 할 것입니다. 이제 앨리스는 동일한 다섯 개의 비트코인 단위를 캐롤에게 전송할 수 없는데(그렇게 되면, 이중 지불 ), 네트워크가 앞선 트랜잭션에서 앨리스가 이미 이를 사용했다는 걸 알고 있기 때문입니다.

사용자 이름이나 비밀번호와 같은 개념은 존재하지 않으며, 자금의 소유권을 증명하기 위해 공개 키 암호방식 이 사용됩니다. 자금을 전달받으려면 먼저, 밥은 개인 키를 생성해야 합니다. 이는 무척 긴 임의의 숫자이며, 수 백 년에 걸쳐서도 누군가 이를 추측하기란 사실상 불가능합니다. 그러나 밥이 자신의 개인 키를 누군가에게 알려준다면, 밥의 자금에 대해 소유권을 증명할 수 있게 됩니다(사용할 수 있음). 따라서 개인 키를 안전하게 보관하는 것이 중요합니다.

그러나 밥은 개인 키로부터 공개 키를 파생시킬 수 있습니다. 이후 밥은 공개 키를 누구에게나 전달할 수 있는데, 이를 분석하여 개인 키를 알아내는 것은 거의 불가능하기 때문입니다. 대부분의 경우, 밥은 공개 키를 통해 공개 주소 를 얻기 위한 다른 작업( 해싱 과 같은)을 수행할 것입니다.

밥은 앨리스에게 공개 주소를 전달하며, 앨리스는 어디로 자금을 전송해야 하는지 알 수 있습니다. 앨리스는 해당 자금을 다음의 공개 주소로 지급하라는 트랜잭션을 생성합니다. 이후, 자신의 자금이 아닌 것을 소비하는 것이 아님을 증명하기 위해, 앨리스는 자신의 개인 키를 사용해 디지털 서명 을 생성합니다. 누구나 앨리스의 서명된 메시지를 받을 수 있으며, 이를 앨리스의 공개 키를 통해 비교해볼 수 있습니다. 이후 앨리스가 밥에게 자금을 전송할 권한이 있다고 분명히 말할 수 있습니다.

비트코인 트랜잭션 생성 방법

비트코인 트랜잭션 생성 방법에 대해 설명하기 위해, 다음의 서로 다른 두 가지 시나리오를 설명해 보겠습니다. 첫 번째는 바이낸스에서 비트코인을 출금하는 과정으로 구성되어 있으며, 두 번째는 트러스트 월렛에서 일렉트럼 지갑으로 자금을 전송하는 것입니다.

바이낸스에서 비트코인 출금하는 방법

1. 바이낸스 계정에 바이낸스 계정에 로그인 합니다. 비트코인이 아직 없다면, 비트코인 구매 방법 을 살펴보시기 바랍니다.

2. 지갑(Wallet) 위로 마우스를 움직여 현물 지갑을 클릭합니다.

3. 사이드바 왼쪽에서 출금을 클릭합니다.

4. 출금하고자 하는 코인을 선택합니다. 여기서는 BTC입니다.

5. 비트코인을 출금하고자 하는 비트코인을 출금하고자 하는 주소 를 복사하고, 이를 수령인의 BTC 주소에 붙여넣기 합니다.

6. 전송하고자 하는 금액을 입력합니다.

7. 제출 버튼을 클릭합니다.

8. 확인 이메일을 받게 될 것입니다. 주소가 정확한지 꼼꼼하게 확인합니다. 주소가 정확하다면 이메일 안에서 트랜잭션을 승인합니다.

9. 여러분의 트랜잭션이 블록체인에 전송되기를 기다립니다. 여러분의 트랜잭션이 블록체인에 전송되기를 기다립니다. 입출금 내역 탭 또는 블록 탐색기 를 통해 현재 상황을 모니터링할 수 있습니다.

트러스트 월렛에서 일렉트럼으로 비트코인 전송하는 방법

이번 예시에서 우리는 트러스트 월렛 에서 일렉트럼 으로 비트코인을 전송할 것입니다.

1. 트러스트 월렛 앱을 시작합니다.

2. 비트코인 계정을 클릭합니다.

3. 전송을 클릭합니다.

4. 일렉트럼 지갑을 엽니다.

5. 일렉트럼에서 수신(Receive) 탭을 클릭하고 주소를 복사합니다.

해당 방법 외에도, 트러스트 월렛으로 돌아가 [–] 아이콘을 클릭해 여러분의 일렉트럼 주소를 가리키는 QR 코드를 스캔할 수 있습니다.

6. 여러분의 여러분의 비트코인 주소를 트러스트 월렛의 수신자(Recipient)에 붙여넣기 합니다.

7. 금액을 입력합니다.

8. 모든 정보가 정확하다면, 트랜잭션을 승인합니다.

9. 다 됐습니다! 블록체인에서 트랜잭션이 승인되기를 기다리면 됩니다. 다 됐습니다! 블록체인에서 트랜잭션이 승인되기를 기다리면 됩니다. 블록 탐색기 에 해당 주소를 붙여 넣기 하여 진행 사항을 모니터링할 수 있습니다.

암호화폐 거래를 생각 중이신가요? 바이낸스에서 비트코인을 구매하세요!

누가 블록체인 기술을 만들었나요?

블록체인 기술은 2009년 최초이자 가장 잘 알려진 블록체인인 비트코인 의 출시와 함께 공식화되었습니다. 그러나 익명의 비트코인 창시자 사토시 나카모토 는 이전의 기술과 제안들에서 영감을 얻었습니다.

블록체인은은 많은 해시 함수와 암호방식을 사용하며, 이는 비트코인이 출시되기 수십 년 전부터 존재 했던 것이었습니다. 흥미롭게도 블록체인 구조에 대한 역사는 1990년대 초반으로 거슬러 올라갈 수 있는데, 당시에는 타임스탬핑 문서에 사용되어 이후 이를 변경할 수 없게 하는 정도로 사용되던 것이었습니다.

해당 주제에 대해 더 알아보고 싶으시다면, 블록체인 역사 를 살펴보시기 바랍니다.

블록체인 기술 장단점

적절하게 설계된 블록체인은 금융에서 농업에 이르기까지 많은 산업에서 지분 보유자를 귀찮게 하는 문제들을 해결합니다. 분산화된 네트워크는 기존의 클라이언트-서버 모델 보다 많은 장점을 갖고 있지만, 몇 가지 단점도 존재합니다.

장점

비트코인 백서 에 명시된 블록체인의 직접적인 장익은 중개자 없이 지불을 처리할 수 있다는 것입니다. 이후의 블록체인들은 여기서 더 나아가, 사용자로 하여금 모든 종류의 정보를 전송할 수 있게 했습니다. 한쪽 당사자를 제거했다는 것은 사용자가 위험에 덜 노출된다는 것이며, 중개자가 차감하는 비용이 없기에 수수료가 더 저렴하다는 의미입니다.

앞서 언급했던 것처럼, 퍼블릭 블록체인에는 허가가 필요하지 않으며, 어떠한 책임자도 없기에 진입 장벽도 없습니다. 만약 한 사용자가 인터넷에 접속할 수 있다면, 그는 네트워크상의 다른 피어들과 상호작용할 수 있을 것입니다.

많은 이들은 블록체인의 가장 중요한 특성이 높은 수준의 검열 저항성이라 주장합니다. 악의적인 행위자가 중앙화된 서비스에 심각한 타격을 주기 위해서는 목표 서버를 공격하면 그만입니다. 그러나 피어투피어 네트워크에서는 모든 노드가 자체적인 하나의 서버 역할을 합니다.

비트코인과 같은 시스템에는 10,000개가 넘는 공개적인 노드들이 전 세계에 흩어져 있으며, 이는 자원이 풍부한 공격자라도 사실상 네트워크를 위태롭게 만들지 못합니다. 그러나 숨겨진 노드들도 많이 있다는 걸 알아둘 필요가 있으며, 이들은 보다 일반적인 네트워크에서는 보이지 않습니다.

이상이 일반적인 장점들입니다. 블록체인은 어디에 사용되나요? 에서 볼 수 있는 것처럼 블록체인이 사용될 수 있는 많은 구체적인 활용 예시 들도 존재합니다.

단점

블록체인이 모든 문제의 특효약은 아닙니다. 앞선 영역에서는 특화된 장점들을 갖고 있을지라도, 다른 영역에서는 부족한 면이 있기도 합니다. 블록체인의 대중적인 채택을 가로막는 가장 분명한 걸림돌은 이를 확장시키기가 무척 어렵다는 것입니다.

분산화된 모든 네트워크가 그렇습니다. 모든 참여자가 동기화 상태를 유지해야 하기 때문에, 새로운 정보는 노드가 따라갈 수 없을 만큼 빠르게 추가될 수 없습니다. 따라서 개발자들은 시스템이 탈중앙화 상태로 남아 있게 하기 위하여 의도적으로 블록체인이 업데이트될 수 있는 속도를 제한합니다.

많은 이들이 트랜잭션을 생성하려 할 경우, 네트워크 사용자에게 이는 분명 지루한 기다림의 시간이 될 수 있습니다. 블록에는 무척 많은 데이터들이 포함되지만, 이것이 체인에 즉각적으로 추가되지는 않습니다. 해당 블록에 더 적합한 트랜잭션이 있는 경우, 이후의 것들은 다음 블록을 기다려야만 합니다.

탈중앙화된 블록체인 시스템에서 발생할 수 있는 또 다른 단점은 업그레이드가 쉽지 않다는 것입니다. 여러분이 자체적인 소프트웨어를 만든다면, 원하는 대로 새로운 기능을 추가할 수 있습니다. 다른 이들과 함께 일하지 않아도 되며, 수정을 위해 허가를 요청할 필요도 없습니다.

수백 만 명의 사용자가 사용하고 있을 수 있는 환경에서는 이러한 변경이 무척 어려울 것입니다. 여러분은 노드 소프트웨어 변수 일부를 변경할 수 있지만, 그렇게 하면 결국 네트워크에서 분리될 뿐입니다. 수정된 소프트웨어가 다른 노드와 호환되지 않는다면, 다른 이들은 이를 알아채고 여러분의 노드와의 상호작용을 거부할 것입니다.

여러분이 블록의 최대 크기에 대한 규칙을 수정(1MB에서 2MB)하고자 한다고 가정해 보겠습니다. 여러분은 해당 블록을 여러분이 연결된 노드에 전송할 수 있지만, 노드는 “1MB가 넘는 블록은 수용하지 않음”이라는 규칙을 갖고 있습니다. 만약 이보다 더 큰 블록을 수신하게 될 경우, 노드는 이를 블록체인 사본에 포함시키지 않을 것입니다.

이러한 변화를 추진할 수 있는 방법은 생태계 다수가 이를 수용하는 것뿐입니다. 주요 블록체인의 경우 변경 사항을 조정하기 위해 포럼 내에서 수개월에서 심지어 수년에 걸친 열띤 토론이 벌어질 수 있습니다. 보다 많은 내용이 궁금하시다면 하드 포크와 소프트 포크 를 살펴보시기 바랍니다.

챕터 2 – 블록체인은 어떻게 작동하나요?

목차

블록은 어떻게 블록체인에 추가되나요?

우리는 이제까지 많은 것을 다뤘습니다. 우리는 노드가 서로 연결되어 있으며, 블록체인 사본을 저장한다는 것을 알고 있습니다. 이들은 트랜잭션과 새로운 블록 정보를 서로에게 전달합니다. 우리는 이미 노드가 무엇인지 다뤘습니다만, 여러분은 새로운 블록이 블록체인에 어떻게 추가되는지 궁금해하실 수도 있습니다.

사용자가 이를 어떻게 해야 한다고 말하는 하나의 자료원은 없습니다. 모든 노드가 동등한 힘을 갖고 있기 때문에, 누가 블록체인에 블록을 추가할 수 있는지를 공정하게 결정하기 위한 메커니즘이 있어야 합니다. 우리에게는 속임수를 쓰는 데는 많은 비용이 들지만, 정직하게 행동하는 이들에게는 보상을 주는 시스템이 필요합니다. 합리적인 모든 사용자들은 자신에게 경제적으로 이익이 되는 방식으로 행동하기를 원할 것입니다.

네트워크에는 허가가 필요하지 않기 때문에, 누구나 블록 생성에 접근할 수 있습니다. 프로토콜은 보통 사용자에게 “투자”를 요구하며, 사용자는 자신의 자금으로 위험을 감수해야 합니다. 이를 통해 사용자들은 블록 생성에 참여할 수 있으며, 유효한 블록을 생성하면 보상을 지급받게 될 것입니다.

그러나 만약 속임수를 쓰려 한다면, 네트워크의 다른 이들이 이를 알아챌 것입니다. 이들은 얼마를 스테이크 했든 이를 잃게 될 것입니다. 우리는 이러한 메커니즘을 합의 알고리즘 이라 하는데, 이것이 네트워크 참여자로 하여금 다음에 어떤 블록이 추가되어야 하는지 하는 합의에 도달할 수 있게 하기 때문입니다.

마이닝(작업 증명)

마이닝은 현재까지 합의 알고리즘에서 가장 많이 사용되는 방법입니다. 마이닝은 작업 증명(PoW) 알고리즘을 사용합니다. 사용자는 자신의 연산 능력을 사용해 프로토콜에서 규정한 문제 해결을 시도합니다.

이러한 문제는 사용자로 하여금 블록에 포함된 트랜잭션과 다른 블록을 해시화하도록 합니다. 그러나 해시가 유효한 것으로 간주되려면, 이는 반드시 특정 숫자값 이하여야 합니다. 출력값이 무엇이 될 것인지 예측할 수 있는 방법이 없기 때문에, 마이너는 유효한 솔루션을 얻을 때까지 조금씩 수정된 데이터를 계속해서 해시화해야 합니다.

분명한 것은 데이터를 반복해서 해시화하는 데 많은 연산 능력이 소비된다는 것입니다. 작업 증명 블록체인에서는 사용자가 마이닝 컴퓨터와 전기세에 투자한 자금이라는 “지분”이 이들의 행동에 동기를 부여합니다. 마이너들은 블록 보상 을 얻기를 바라며 마이닝을 하는 것입니다.

앞서 해시를 되돌리는 것이 사실상 불가능하지만, 이를 쉽게 확인할 수 있다고 했던 것을 기억하시나요? 마이너가 새로운 블록을 네트워크에 전송할 때, 다른 모든 노드는 이를 해시 함수의 입력값으로 사용합니다. 이들은 해당 블록이 블록체인 규칙 속에서 유효한지 확인해 보려면 이를 그저 실행해보면 됩니다. 블록이 유효하지 않다면 마이너는 보상을 수령할 수 없고, 그저 전기세를 낭비하게 될 것입니다.

첫 번째 작업 증명 블록체인은 비트코인이었습니다. 비트코인이 생겨난 이후, 많은 블록체인이 작업 증명 메커니즘을 채택해 왔습니다.

작업 증명의 장점

검증되었고 테스트됨 – 작업 증명은 가장 성숙한 합의 알고리즘이며, 수천억 달러에 해당하는 가치를 보증하고 있습니다.

– 작업 증명은 가장 성숙한 합의 알고리즘이며, 수천억 달러에 해당하는 가치를 보증하고 있습니다. 허가가 필요 없음 – 누구나 마이닝 경쟁에 참여하거나 검증 노드를 운영할 수 있습니다.

– 누구나 마이닝 경쟁에 참여하거나 검증 노드를 운영할 수 있습니다. 탈중앙화 – 마이너는 블록 생성을 위해 서로 경쟁하는데, 이는 해시 파워가 단일 주체에 의해 통제되는 법이 없음을 뜻합니다.

작업 증명의 단점

낭비적임 – 마이닝은 엄청난 양의 전기를 소비합니다.

– 마이닝은 엄청난 양의 전기를 소비합니다. 진입 장벽이 점차 높아지고 있음 – 더 많은 마이너들이 네트워크에 참여함에 따라, 프로토콜은 마이닝 문제의 난이도를 높이고 있습니다. 경쟁력을 갖추기 위해서 사용자는 더 좋은 장비에 투자해야만 합니다. 이는 많은 마이너들에게 부담이 되는 일일 수 있습니다.

– 더 많은 마이너들이 네트워크에 참여함에 따라, 프로토콜은 마이닝 문제의 난이도를 높이고 있습니다. 경쟁력을 갖추기 위해서 사용자는 더 좋은 장비에 투자해야만 합니다. 이는 많은 마이너들에게 부담이 되는 일일 수 있습니다. 51% 공격 – 마이닝은 탈중앙화를 촉진시키지만, 한 마이너가 해시 파워 다수를 획득할 가능성도 있습니다. 만약 그렇게 된다면 이들은 이론적으로 트랜잭션을 되돌리고, 블록체인 보안을 위협할 수 있습니다.

스테이킹(지분 증명)

작업 증명 시스템에서 마이너를 정직하게 행동하도록 만드는 것은 이들이 마이닝 컴퓨터와 전기세에 지불한 자금입니다. 블록을 제대로 마이닝하지 못하면, 투자 수익 을 올릴 수 없을 것입니다.

지분 증명(PoS) 에서는 외부적인 비용이 발생하지 않습니다. 마이너 대신 검증자가 존재하며 이들은 블록을 제안(혹은 “형성”)합니다. 이들은 보통의 컴퓨터를 사용해 새로운 블록을 생성할 수 있으나, 특권을 누리기 위해서는 상당한 양의 자금을 스테이크해야 합니다. 스테이킹은 각 프로토콜의 규칙을 따라 블록체인의 자체 통화가 사전에 정해둔 수량을 따라 진행됩니다.

여러 구현에 차이점들이 존재하지만, 검증자가 자금을 스테이크한 다음에는 프로토콜에 의해 다음 블록을 발표하기 위해 임의로 선정될 수 있습니다. 이를 정확하게 해낸다면, 보상을 받습니다. 이 외에도 다음 블록을 승인하는 다수의 검증자가 있을 수 있으며, 보상은 스테이크 한 수량에 비례해 분배될 것입니다.

“순수한” 지분 증명 블록체인은 사용자가 전체 네트워크 블록을 검증하기 위해 노드(증인)에 투표하는 위임 지분 증명(DPoS) 보다 드뭅니다.

이더리움 은 스마트 콘트랙트 블록체인을 선도하는 것이며, ETH 2.0으로 옮겨감에 따라 머잖아 지분 증명으로 옮겨갈 것입니다.

지분 증명의 장점

환경 친화적임 – 지분 증명의 탄소 발자국은 작업 증명 마이닝의 일부에 불과합니다. 스테이킹은 자원 집약적인 해싱 작업을 필요로 하지 않습니다.

– 지분 증명의 탄소 발자국은 작업 증명 마이닝의 일부에 불과합니다. 스테이킹은 자원 집약적인 해싱 작업을 필요로 하지 않습니다. 더 빠른 트랜잭션 프로토콜이 정한 임의의 문제를 풀기 위해 부가적인 연산 능력을 소비하지 않아도 되기 때문에, 일부 지분 증명 지지자들은 트랜잭션 출력량이 높아질 수 있다고 주장합니다.

프로토콜이 정한 임의의 문제를 풀기 위해 부가적인 연산 능력을 소비하지 않아도 되기 때문에, 일부 지분 증명 지지자들은 트랜잭션 출력량이 높아질 수 있다고 주장합니다. 스테이킹 보상과 이자 – 보상이 마이너에게 가는 대신, 이는 네트워크를 보호하기 위해 토큰 보유자들에게 직접 지급됩니다. 어떤 경우에는 지분 증명을 통해 사용자는 에어드랍, 이자를 지급받거나 또는 간단히 자금을 스테이킹하고 소극적 소득을 올릴 수 있습니다.

지분 증명의 단점

상대적으로 덜 테스트 됨 – 지분 증명 프로토콜은 아직까지 큰 규모에서는 테스트되지 않았습니다. 지분 증명의 구현과 암호경제학에 발견되지 않은 위험성이 존재할 수 있습니다.

– 지분 증명 프로토콜은 아직까지 큰 규모에서는 테스트되지 않았습니다. 지분 증명의 구현과 암호경제학에 발견되지 않은 위험성이 존재할 수 있습니다. 금권 정치 – “부유한 이들을 더 부유하게” 만드는 지분 증명 생태계에 대한 우려가 증가하고 있습니다. 스테이크를 많이 한 검증자는 더 많은 보상을 받아가곤 합니다.

– “부유한 이들을 더 부유하게” 만드는 지분 증명 생태계에 대한 우려가 증가하고 있습니다. 스테이크를 많이 한 검증자는 더 많은 보상을 받아가곤 합니다. 노드의 손해가 전혀 없다는 문제 – 작업 증명에서 사용자는 단 하나의 체인에만 “베팅”할 수 있으며, 이들은 해당 체인이 가장 성공적일 것이라 믿으며 마이닝을 합니다. 하드 포크가 발생하면, 이들은 동일한 해시 파워로 다수의 체인에 베팅할 수 없습니다. 그러나 지분 증명에서는 약간의 추가 비용만 있으면 다수의 체인에서 작업할 수 있으며, 이는 경제적 문제를 불러일으키게 됩니다.

다른 합의 알고리즘

작업 증명과 지분 증명은 가장 일반적인 합의 알고리즘 이지만, 더 많은 합의 알고리즘들이 존재합니다. 일부는 두 시스템 요소를 결합한 하이브리드 방식이며, 다른 것들은 전적으로 다른 방식입니다.

여기서는 자세히 알아보지는 않겠지만, 관심이 있으시다면 다음의 아티클들을 확인해보시기 바랍니다.

블록체인 트랜잭션을 되돌릴 수 있나요?

다양한 방식으로 구현된 블록체인이 존재하며, 이들 간의 근본적인 차이점은 네트워크 내에서 어떻게 블록체인은 무척 튼튼한 데이터베이스로 설계되어 있습니다. 블록체인의 자체적인 속성은 기록 이후 이를 제거하거나 수정하는 것을 무척 어렵게 만들며, 비트코인 과 다른 대규모 네트워크에서는 거의 불가능한 일입니다. 따라서 블록체인상에서 트랜잭션을 생성할 때는 이를 바위에 영원히 새기는 것이라 생각하는 것이 좋습니다.다양한 방식으로 구현된 블록체인이 존재하며, 이들 간의 근본적인 차이점은 네트워크 내에서 어떻게 합의 를 달성하느냐 하는 것입니다. 이는 특정 구현에서는 상대적으로 적은 참여자 그룹이 네트워크 내에서 트랜잭션을 효과적으로 되돌릴 만큼 충분한 파워를 얻게 될 수 있음을 의미합니다. 이는 특별히 규모가 작은 네트워크상에서 운영되는 알트코인에서 우려할만한 사항입니다(적은 마이닝 경쟁 때문에 해시 레이트가 낮음).

블록체인 확장성이란 무엇인가요?

블록체인 확장성은 블록체인 시스템이 증가하는 수요를 감당할 수 있는 능력을 가리키는 데 포괄적으로 사용되는 용어입니다. 블록체인의 이상적인 속성(탈중앙화, 검열 저항성, 불변성 )에는 비용이 따릅니다.

탈중앙화된 시스템과 다르게, 중앙화된 데이터베이스는 상당히 빠른 속도와 출력량을 보여줄 수 있습니다. 이는 네트워크의 내용이 수정될 때마다 이를 동기화하는 전 세계에 흩어진 수천 개의 노드가 필요없기 때문입니다. 그러나 블록체인은 다릅니다. 확장성은 블록체인 개발자들 사이에서 수년간 치열하게 논의된 주제였습니다.

블록체인의 성능 문제점을 보완하기 위한 다양한 해결책들이 제시되고 또 구현되어 왔습니다. 그러나 현재까지 완벽한 접근법은 존재하지 않습니다. 확장성 문제에 대해 다양한 해결책들이 보다 간결한 해답을 제시하기까지는 실험이 계속되야 할 것입니다.

보다 넓은 관점에서는 확장성과 관련된 근본적인 의문이 존재합니다. 우리는 블록체인 자체의 성능을 향상 시켜야 할까요(온체인 스케일링), 아니면 트랜잭션이 메인 블록체인의 크기를 키우지 않고 실행되게 해야 할까요(오프체인 스케일링)?

두 방법 모두 분명한 장점이 있을 것입니다. 온체인 스케일링 해결책은 트랜잭션 크기를 줄이거나, 단순히 블록에 데이터가 저장되는 방식을 최적화 할 수 있습니다. 반면, 오프체인 해결책은 메인 블록체인 밖에서 트랜잭션을 묶어, 이를 나중에 추가하는 것입니다. 가장 잘 알려진 오프체인 해결책으로는 사이드체인과 지불 채널이라 하는 것이 있습니다.

블록체인은 왜 확장되어야 하나요?

블록체인 시스템이 중앙화된 상대 주체와 경쟁하게 된다면, 적어도 비슷한 수준의 성능을 보여줘야 할 것입니다. 그러나 현실적으로 블록체인 시스템은 개발자와 사용자에게 더 많은 인센티브를 제공하여, 이들이 블록체인 기반 플랫폼과 애플리케이션으로 옮겨오게 해야 할 것입니다.

이는 중앙화된 시스템과 비교하여, 블록체인을 사용하는 것이 개발자와 사용자에게 더 빠르고, 저렴하고, 편리해야 함을 의미합니다. 그러나 앞서 우리가 논의했던 블록체인을 규정하는 특징들을 논의하며 이를 달성하는 것은 쉽지 않습니다.

블록체인 포크란 무엇인가요?

다른 소프트웨어와 마찬가지로 블록체인도 문제를 해결하고, 새로운 규칙을 추가하고, 오래된 것을 삭제하기 위한 업그레이드를 필요로 합니다. 블록체인 소프트웨어는 오픈 소스 이기 때문에, 이론적으로는 누구나 네트워크를 관리하는 소프트웨어에 추가할 새로운 업데이트를 제안할 수 있습니다.

한 가지 잊지 말아야 할 것은 블록체인은 분산화된 네트워크라는 것입니다. 시스템이 업그레이드 되면, 전 세계에 흩어져 있는 수 천개의 노드는 새로운 버전과 통신하고 이를 시행해야 합니다. 하지만 참여자가 시행되는 업그레이드에 동의하지 않는다면 어떻게 될까요? 보통 의사 결정 흐름을 결정하는 전문 조직은 존재하지 않습니다. 이는 소프트 포크와 하드 포크로 이어질 수 있습니다.

소프트 포크

업그레이드 방법에 대한 일반적인 합의가 있다면, 이는 보다 간단한 문제일 것입니다. 해당 시나리오에서 소프트웨어는 구버전과 호환이 가능한 것으로 업데이트되며, 업데이트 된 노드가 그렇지 않은 노드와 여전히 상호 작용할 수 있습니다. 그러나 실제로는 시간이 지나며 거의 모든 노드가 업그레이드를 진행할 것입니다. 이를 소프트 포크라고 합니다.

하드 포크

하드 포크는 보다 복잡합니다. 하드 포크가 시행되면 새로운 규칙과 기존의 규칙은 호환이 불가능할 것입니다. 따라서 새로운 규칙을 따르는 노드가 기존의 규칙을 따르는 노드와 상호 작용을 시도할 경우, 통신이 불가능할 수 있습니다. 결과적으로 블록체인은 기존의 소프트웨어를 운영하는 것과 새로운 규칙을 따르는 것, 두 개로 나뉘게 됩니다.

하드 포크 이후에는 기본적으로 두 가지 다른 프로토콜을 따르는 네트워크가 병렬적으로 존재합니다. 포크가 발생할 때 기존 네트워크 블록체인의 자산 잔고가 복제된다는 것을 알아둘 필요가 있습니다. 따라서, 포크 당시 기존 체인에 잔고가 있을 경우, 새로운 체인에도 잔고가 있게 됩니다.

보다 자세한 사항은 하드 포크와 소프트 포크 를 살펴보시기 바랍니다.

챕터 3 – 블록체인은 어디에 사용하나요?

목차

블록체인 기술은 다양한 분야에 활용 될 수 있습니다. 몇 가지 예시들을 살펴보도록 하겠습니다.

공급망을 위한 블록체인

효율적인 공급망은 성공적인 여러 비즈니스의 핵심 요소이며, 공급자에게서 소비자에게 상품을 전달하는 것과 관련된 것입니다. 기존의 특정 산업에서는 다수의 지분 보유자들 사이에 조정을 이뤄내는 것이 어려운 것으로 증명되어 왔습니다. 그러나 블록체인 기술을 사용하면 여러 업계가 새로운 수준의 투명성을 달성할 수 있습니다. 불변하는 데이터베이스를 중심으로 한 상호운영 가능한 공급망 생태계는 보다 튼튼하고 신뢰할만한 것이 될 수 있습니다.

이에 대해 더 자세히 알아보고 싶으시다면, 블록체인 활용 예시: 공급망 을 확인해 보시기 바랍니다.

블록체인과 게임 산업

게임 업계는 세계에서 가장 큰 오락 산업 중 하나가 되었으며, 블록체인 기술을 아주 유용하게 사용할 수 있습니다. 일반적으로 게이머들은 게임 개발자에게 관대한 경향이 있습니다. 대부분의 온라인 게임에서 게이머는 개발자의 서버 공간에 의존하며, 계속해서 변화하는 일련의 규칙들을 따릅니다. 이러한 상황에서 블록체인은 온라인 게임 소유권, 관리, 유지를 탈중앙화시키는 데 도움이 될 수 있습니다.

그러나 가장 큰 문제가 될 수 있는 것은, 게임 바깥에서는 게임 아이템의 소유권이 존재하지 않는다는 것이며, 이에 대한 진정한 소유권을 갖거나 중고 시장에서 거래할 가능성을 제공하지 않는다는 것입니다. 블록체인 기반 접근법을 활용하면 게임은 보다 장기적으로 지속 가능해질 수 있으며, 암호 수집물 로 발행된 게임 아이템은 실제 세계에서 가치를 가질 수 있습니다.

이에 대해 더 알아보고 싶으시다면, 블록체인 활용 예시: 게임 을 확인해 보시기 바랍니다.

의료를 위한 블록체인

모든 의료 시스템에서는 의료 기록을 신뢰할 수 있는 방식으로 저장하는 것이 필수적이며, 민감한 정보를 중앙화된 서버에 남겨두는 것은 위험해질 수 있습니다. 블록체인 기술의 투명함과 보안은 의료 기록을 저장하는 데 이상적인 플랫폼을 만드는 데 사용될 수 있습니다.

환자들의 기록을 암호학적으로 보호하는 것은, 환자들의 프라이버시를 보호하는 동시에 자신의 의료 정보를 다른 모두 의료 기관에 공유할 수 있게 합니다. 안전하고 세계적인 데이터베이스를 활용하면, 현재는 파편화되어 있는 의료 시스템 참여자 모두에게 정보가 보다 신속하게 전달될 수 있을 것입니다.

이에 대해 더 알아보고 싶으시다면, 블록체인 활용 예시: 의료 를 확인해 보시기 바랍니다.

블록체인 송금

기존 은행을 통해 자금을 국제적으로 송금하는 것은 번거로운 일입니다. 대부분 대단히 복잡한 네트워크 중개자 때문이며, 수수료와 지불 시간 때문에 긴급한 트랜잭션에는 기존의 은행을 이용하는 것은 비싸며 신뢰하기가 어렵습니다.

암호화폐와 블록체인은 이러한 생태계의 중개자를 제거하며, 전 세계로 저렴하고 빠른 송금을 가능하게 합니다. 이상적인 몇 가지 속성을 위해 블록체인은 분명 성능을 포기했지만, 다양한 프로젝트가 저렴하고 거의 즉각적인 트랜잭션을 위해 블록체인 기술을 활용하고 있습니다.

이에 대해 더 알아보고 싶으시다면, 블록체인 활용 예시: 송금 을 확인해 보시기 바랍니다.

암호화폐 거래를 생각 중이신가요? 바이낸스에서 비트코인을 구매하세요!

블록체인과 디지털 신원

인터넷상에서 신원을 안전하게 관리하는 것은 시급히 해결해야 할 중대한 문제입니다. 막대한 수준의 우리의 데이터는 중앙화된 서버에 저장되어 있으며, 우리의 인식이나 동의 없이 머신 러닝 알고리즘 을 통해 분석되고 있습니다.

블록체인 기술을 통해 사용자는 자신의 데이터에 대한 소유권을 갖고, 필요할 때만 제3자에게 선택적으로 정보를 공개 할 수 있습니다. 이러한 형태의 암호 방식은 프라이버시를 희생하지 않고도, 보다 매끄러운 온라인 경험을 가능하게 합니다.

이에 대해 더 알아보고 싶으시다면, 블록체인 활용 예시: 디지털 신원 을 확인해 보시기 바랍니다.

블록체인과 사물 인터넷(IoT)

오늘날 상당히 많은 물리적 기기들이 인터넷 에 연결되고 있으며, 그 숫자는 계속해서 증가하고 있습니다. 일부는 블록체인 기술을 통해 이러한 기기 사이의 통신과 협동이 크게 확장될 수 있다고 추측합니다. 자동화된 기계-대-기계(M2M) 소규모 지불은, 안전하고 처리량이 높은 데이터베이스 솔루션에 기반하는 새로운 경제를 창조할 수 있습니다.

거버넌스를 위한 블록체인

분산화된 네트워크는 컴퓨터 코드로 된 자체적인 형태의 규칙을 규정하고 시행할 수 있습니다. 블록체인이 지역, 국가, 또는 국제적 수준의 다양한 거버넌스 과정에서 중개자를 제거할 수 있다는 것은 그다지 놀라운 것은 아닙니다.

뿐만 아니라, 블룩체인은 오늘날 오픈 소스 개발 환경이 마주하고 있는 가장 큰 문제 중 하나인 자금의 분산화에 대한 신뢰할 수 있는 메커니즘의 결여라는 문제를 해결할 수 있습니다. 블록체인 거버넌스는 모든 참여자가 의사 결정에 참여하도록 보장하며, 어떤 규칙이 시행되어야 하는지에 대한 투명한 개괄을 제공합니다.

이에 대해 더 알아보고 싶으시다면, 블록체인 활용 예시: 거버넌스 를 확인해 보시기 바랍니다.

자선 단체를 위한 블록체인

자선 단체는 자금을 모집하는 방법에 있어 종종 한계를 경험하게 됩니다. 이보다 좌절스러운 것은, 기부 자금의 최종 도착지를 정확하게 추적하기 힘들다는 것이며, 이는 분명 해당 단체를 지원하는 것을 주저하게 만듭니다.

”암호화폐 자선 활동”은 블록체인 기술을 사용해 이러한 한계를 극복합니다. 보다 높은 수준의 투명성과 세계적 참여, 절감된 비용과 같은 블록체인 기술의 고유한 속성에 기반하는 새로운 분야들이 자선 단체의 영향력을 극대화하기 위해 노력하고 있습니다. 블록체인 자선 재단 은 그러한 단체 중 하나입니다.

이에 대해 더 알아보고 싶으시다면, 블록체인 활용 예시: 자선 단체 를 확인해 보시기 바랍니다.

예측 시장을 위한 블록체인

예측 시장은 블록체인 기술이 가장 대중적으로 사용되는 분야 중 하나가 분명합니다. 차질 없는 거래소 간의 송금, 비위탁 거래 솔루션, 성장하는 파생 상품 생태계는 블록체인이 모든 유형의 예측 시장에서 하나의 이상적인 장이 되게 합니다

블록체인의 자체적인 속성 때문에 이는 새롭게 출현하는 자산 유형에 기꺼이 위험을 감수하고 참여하려는 이들에게 훌륭한 도구입니다. 누군가는 기술과 규제가 성숙되면, 세계의 모든 예측 시장이 블록체인상에서 토큰화될 수 있다고 생각하기도 합니다.

이에 대해 더 알아보고 싶으시다면, 블록체인 활용 예시: 예측 시장 을 확인해 보시기 바랍니다.

블록체인을 통한 크라우드펀딩

온라인 크라우드펀딩 플랫폼은 이미 수십 년 간 피어투피어 경제의 초석을 놓았습니다. 이러한 사이트의 성공은 외부에서 크라우드펀딩으로 자금을 모은 제품 개발에 진정한 관심들이 존재한다 걸 보여줍니다. 그러나 이러한 플랫폼들은 자금 위탁자 기능을 하기 때문에, 상당한 수준의 수수료를 부과할 수도 있습니다. 게다가 서로 다른 참여자들 간의 합의를 가능하게 하기 위한 자체적인 일련의 규칙들을 보유하고 있을 것입니다.

블록체인 기술, 보다 정확하게는 스마트 콘트랙트 는 동의 약관이 컴퓨터 코드에 의해 정의된 보다 안전하고 자동화된 크라우드펀딩을 가능하게 할 수 있습니다.

블록체인과 분산화된 파일 시스템

인터넷상의 분산화된 파일 저장소는 기존의 중앙화된 것에 비해 많은 장점을 갖고 있습니다. 중앙화된 서버와 서비스 제공자에 기반하는 클라우드에 저장된 많은 데이터는 공격과 데이터 손실에 보다 취약합니다. 어떤 경우에는 사용자는 중앙화된 서버의 검열 때문에 접속 문제를 겪을 수도 있습니다.

파일을 업로드하고, 저장하며, 이에 접근할 수 있기 때문에 사용자의 관점에서 볼 때, 블록체인 파일 저장소 솔루션은 다른 클라우드 저장 솔루션과 같아 보일 것입니다. 그러나 그 이면의 작동 방식은 꽤나 다릅니다.

여러분이 블록체인에 파일을 업로드하면, 이는 다수의 노드에 배포되고 복제됩니다. 어떤 경우에는 각 노드가 파일의 서로 다른 부분을 저장할 것입니다. 이데이터 일부만을 가지고는 많은 것을 할 수 없지만, 여러분은 향후 각 노드에게 해당 부분을 요청할 수 있으며, 이들을 조합해 파일을 완전히 돌려 받을 수 있습니다.

이러한 저장 공간은 자신의 저장 공간과 대역폭을 네트워크에 제공하는 참여자들로부터 비롯된 것입니다. 해당 참여자들은 보통 자원을 제공하도록 하는 경제적 인센티브를 제공 받으며, 규칙을 따르지 않거나 파일 저장 또는 제공에 실패할 경우 경제적인 불이익을 당하게 됩니다.

여러분은 이러한 형태의 네트워크가 비트코인과 유사하다고 생각할 수 있습니다. 그러나 이 경우에는 네트워크의 주된 목표가 금전적 가치 전달을 지원하는 것이 아니라, 검열 저항적이고 탈중앙화된 파일 저장소를 제공하는 것에 있습니다.

키워드에 대한 정보 블록 체인 구현 방법

다음은 Bing에서 블록 체인 구현 방법 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 블록체인. 개발자가 쉽게 설명해드림. 10분컷.

  • 코딩
  • 프로그래밍

블록체인. #개발자가 #쉽게 #설명해드림. #10분컷.


YouTube에서 블록 체인 구현 방법 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 블록체인. 개발자가 쉽게 설명해드림. 10분컷. | 블록 체인 구현 방법, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment