블록체인 탐험기 #2 블록체인 합의 알고리즘
지난번에는 블록체인의 개념에 대해 알아보고 이를 바탕으로 Ainize Workspace를 통해 AI Network에 직접 트랜잭션을 발생 시켜 보았습니다. 이번 글에서는 블록체인의 합의 알고리즘에 대해 살펴보고 어떤 방법으로 작동하는지 Ainize Workspace를 통해 간단한 코드를 실행하여 알아보겠습니다
얼마 전 테슬라의 CEO인 엘론 머스크가 환경 오염을 이유로 테슬라 결제 수단에서 비트코인 사용을 중단하겠다고 선언하였습니다. 비트코인과 환경 오염 간에는 어떠한 관계가 있길래 이런 발언을 하였을까요? 이는 블록체인의 합의 알고리즘과 관련이 있습니다.
합의 알고리즘은 시스템이 분산화되어 있을 때, 시스템 간의 특정 데이터에 대한 동일한 값이 유지되기 위해 고안된 개념입니다. 그렇다면 블록체인에서 왜 합의 알고리즘이라는 단어가 나오는 걸까요? 이는 블록체인의 특징인 탈중앙화와 관련되어 있습니다. 블록체인은 노드들이 연결되어 트랜잭션을 처리하고 기록하는 P2P 네트워크 분산 원장 시스템입니다. 블록체인의 모든 노드는 동일한 트랜잭션을 공유해야 하며, 최종적으로는 모든 노드가 동일한 체인을 가질 수 있도록 블록을 생성하는 알고리즘이 필요합니다. 그뿐만 아니라 블록체인은 트랜잭션과 블록의 유효성을 판단해줄 중앙 서버가 존재하지 않고, 탈중앙화된 P2P 네트워크에선 악의적인 변조, 네트워크 지연 등의 문제가 있을 수 있기 때문에 합의 알고리즘은 필요합니다.
PoW(Proof of Work)
작업 증명(PoW)은 특정 난이도의 해시값을 구하는 연산을 통해 블록을 생성할 수 있는 권한을 주는 알고리즘입니다. 즉, 풀기 어려운 문제를 제시하고 이를 빨리 해결한 사람에게 블록 생성 권한을 부여하는 것입니다.
지난 편에서도 설명했던 것처럼 블록의 해시값을 구하기 위해서는 연결할 블록의 해시 값 이외에도 다른 정보들을 입력값으로 가져와야 합니다. 그중 하나가 Nonce라는 값인데 블록 헤더, 트랜잭션 등과 달리 이는 주어지는 값이 아니라 직접 구해야 되는 값입니다. Nonce를 구해야 최종적인 블록의 해시값을 알 수 있습니다. Nonce를 구하기 위해서는 어려운 문제를 풀어야 하는데 이는 수학적 연산을 반복적으로 수행하는 단순 연산으로 높은 컴퓨팅 파워(GPU)가 있으면 유리합니다. 문제에 대해 조금 더 설명해보겠습니다. 비트코인의 경우 이전 블록의 해시값, Nonce, 데이터값을 가지고 해시 함수를 통과하여 얻은 해시값이 19개의 0으로 시작해야 블록을 생성할 수 있는 권한이 생기게 됩니다.
작업 증명에는 높은 컴퓨팅 파워가 필요하므로 그에 따른 막대한 양의 전기 비용이 들게 됩니다(이러한 이유로 비트코인이 환경 오염을 일으킨다고 주장한 것입니다). 그렇다면 보상은 어떠한 방법으로 해주게 될까요? 채굴자는 총 2번 보상을 받게 되는데 거래 내역을 검증하면서 거래 수수료를 받고 블록을 등록하면서 암호 화폐를 받게 됩니다.
PoS(Proof of Stake)
시간이 지날수록 작업 증명의 경우 막대한 양의 전기 소비와 특정 나라에 의한 채굴 독점화가 발생하기 시작하였습니다. 이러한 문제를 해결하기 위해 나온 것이 지분 증명(PoS)입니다.
지분 증명은 참여자의 암호 화폐 지분이 블록 생성 권한에 영향을 주는 알고리즘입니다. 즉, 암호 화폐가 많을수록 유리해지는 방식이죠. 블록 등록자는 사용자가 보유하고 있는 암호 화폐량이나 암호 화폐를 가지고 있는 기간을 바탕으로 무작위로 선정됩니다. 블록 등록자를 무작위로 선정하기 때문에 중앙 집중화를 막을 수 있습니다. 무작위로 선정하지 않는다면 암호화폐를 많이 가지고 있는 사람이 항상 블록을 등록하고 지속해서 부를 창출할 것이기 때문입니다. 이 알고리즘은 만약 블록 공격자가 악의적인 행동이 발각되면 보유 암호 화폐를 0으로 만다는 페널티를 부여하여 공격을 방지합니다.
DPoS(Delegated Proof of Stake)
위임지분증명(DPoS)은 PoS 알고리즘을 변형하여 만들어진 알고리즘입니다. 암호 화폐 소유자들이 자신의 지분에 비례하여 투표를 진행하고 대표자를 선정합니다. 그 후, 선정된 대표자들끼리 합의하여 의사 결정을 내리게 됩니다. 위임지분증명의 경우 몇몇 대표 노드들에게만 트랜잭션 승인을 거치면 되니 처리 속도는 훨씬 빨라집니다. 소규모 참여자는 대표자에게 권한을 위임하고 위임한 상위노드로부터 이자를 받거나 송금 수수료를 감면받을 수 있습니다.
AI Network의 합의 알고리즘
AI Network의 합의 알고리즘은 텐더민트 합의 알고리즘에 기반합니다. 텐더민트 합의 알고리즘과 마찬가지로 AI Network의 합의 알고리즘은 Propose, Pre-vote, Pre-commit 3단계로 진행됩니다. 우선 AIN을 스테이킹하는 노드를 Validator라고 하며, Validator 중 한 명이 블록 제안자로 선정이 됩니다. Propose 단계에서는 블록 제안자가 블록을 생성하고 다른 Validator 들에게 알립니다. BLOCK_CREATION_INTERVAL로 설정한 시간 내에 제안 블록이 수신되고 트랜잭션들이 검증되면 Pre-vote 단계로 넘어가게 됩니다. 만약 BLOCK_CREATION_INTERVAL내에 블록이 도착하지 않는다면, 블록 제안자가 새로 뽑히게 되고 Propose 단계가 다시 실행됩니다. Pre-vote 단계에서는 Validator들이 사전 투표를 진행하고 지분의 합계가 2/3가 넘는다면, Pre-commit 단계로 넘어갑니다. Pre-commit 단계에서는 Validator 들이 Pre-commit을 진행하는데 2/3 이상이 Pre-commit을 했으면 최종적으로 해당 블록이 등록되고 다시 Propose 단계로 돌아가게 됩니다.
AIN 스테이킹은 link를 통해 할 수 있습니다.
PoW 체험해보기
비트코인의 PoW는 어떤 방법으로 작동하는지 Ainize Workspace를 통해 간단한 코드를 실행하여 알아보겠습니다. Ainize Workspace는 link를 통해 만들 수 있습니다.
nonce = 0
data = "Hi AI Network!"
previous_hash = "00002132dec10bba23afbbc9ee3a8964a8193bf979f1ba8f6b4c4153c03072b3f2"
우선 PoW에서 사용할 값들에 대해 초깃값 설정을 해줍니다. 위에서 설명한 거처럼 블록의 해시값을 구하기 위해서는 이전 블록의 해시값, 데이터, 논스 등의 값이 필요합니다.
그 후, 이 값들을 더하여 SHA 256 해시함수를 통해 해시값을 구해보겠습니다.
def caculate_hash(previous_hash, data):
# calculate a hash value by adding the values of previous_hash, data, and nonce
hash = hashlib.sha256((previous_hash + data + str(nonce)).encode()).hexdigest()
pirnt(hash)
# 0d80b4fa3f10ee14081f40c11199a0241e152dadaad5abf2cbe...
return hash
해시값을 구했다면 주어진 문제를 풀어야 하는데, 비트코인의 경우 현재 주어진 문제는 ‘블록의 해시값이 19개의 0으로 시작하게 만드는 nonce 값을 찾아라.’ 입니다. 이전 블록의 해시값과 데이터는 수정할 수 없기 때문에 블록 생성자는 오직 nonce의 값을 변경하면서 해당 문제를 찾아야 합니다. difficulty
의 경우 채굴 난이도를 뜻합니다. 여기에서 difficulty
는 해시값이 몇 개의 0으로 시작하냐를 의미합니다. 즉 difficulty
가 높아질 수록 0으로 시작하는 해시값을 찾는 데 오래 걸리게 됩니다. 비트코인의 경우 10분마다 블록을 생성하게 되는데, 블록이 너무 빨리 생성되면 difficulty
를 높여 블록 생성 시간을 늘립니다.
def mine_block(difficulty):
global nonce
temp_hash = caculate_hash(previous_hash, data)
# check how many zeros hash value starts with
while temp_hash[:difficulty] != ('0' * difficulty):
# increase the nonce everytime the loop runs
nonce += 1
temp_hash = caculate_hash(previous_hash, data)
print("Block Mined! : ", temp_hash)
print("Nonce : ", nonce)
# Block Mined! : 000040e0d2c6924bdb7cc99591bbbf75dd84cc1...
# Nonce : 12379
mine_block(4)
이번 글은 블록체인의 합의 알고리즘에 대해 알아보았습니다. 다음 편에는 AI Network는 다른 네트워크에 비해 어떠한 특징이 있는지 알아보도록 하겠습니다.
Reference
AI 네트워크는 블록체인 기반 플랫폼으로 인공지능 개발 환경의 혁신을 목표로 하고 있습니다. 수백만 개의 오픈 소스 프로젝트가 라이브로 구현되는 글로벌 백엔드 인프라를 표방합니다.
최신 소식이 궁금하시다면 아래 커뮤니케이션 채널을 참고해주시기 바랍니다. 다시 한 번 감사합니다.
AI네트워크 공식 홈페이지: https://ainetwork.ai/
공식 텔레그램: telegram.com/ainetwork_kr
아이나이즈(Ainize): https://ainize.ai
유튜브: https://www.youtube.com/channel/UCnyBeZ5iEdlKrAcfNbZ-wog
페이스북: https://www.facebook.com/ainetworkofficial/
포럼: https://forum.ainetwork.ai/
AIN Price chart: https://coinmarketcap.com/currencies/ai-network/onchain-analysis/