블록체인 — ETH.BUILD
블록체인 채굴의 작동 방식, 블록이 체인으로 연결되는 방법, 작업증명(PoW)이 블록체인을 보호하는 방법, 누군가 데이터를 조작하려 할 때 발생하는 일에 대한 데모입니다.
Date published: 2021년 1월 14일
오스틴 그리피스(Austin Griffith)가 ETH.BUILD 시각적 프로그래밍 도구를 사용하여 블록체인 채굴이 어떻게 작동하는지 보여주는 튜토리얼입니다. 오스틴은 작업증명(PoW) 합의, 블록 체이닝, 채굴 난이도, 블록 보상 및 체인의 불변성을 다룹니다.
이 대본은 오스틴 그리피스가 게시한 원본 비디오 대본 (opens in a new tab)의 접근성 향상 버전입니다. 가독성을 위해 약간 편집되었습니다.
조정의 문제 (0:00)
좋은 아침입니다, 즐거운 나비넥타이의 금요일(Bowtie Friday)입니다! 이번 ETH.BUILD는 정말 멋진 기술인 블록체인에 초점을 맞춥니다. 우리는 이 광대 배에 타고 있고, 이를 위해 비트코인 나비넥타이를 맸습니다. 자, 시작해 봅시다.
지금까지의 교육 과정에서 우리는 키 쌍, 해시, 원장에 대해 자세히 살펴보았습니다. 우리가 발견한 것은 중앙 집중식 네트워크가 아닌 분산 네트워크에서 가치를 주고받고자 할 때 조정의 문제에 부딪힌다는 것입니다. 모든 사람이 서로 다른 시간에 서로 다른 트랜잭션을 수신하기 때문에 서로 다른 당사자 간에 합의를 이룰 수 없는 문제에 직면하게 됩니다. 이를 해결할 수 있는 여러 가지 방법이 있지만, 작업증명(PoW)이 등장하기 전까지는 어느 것도 완벽하지 않았습니다.
우리는 사이드 퀘스트로 비잔틴 장군 문제를 다루었고, 거기서 배운 것은 장군들이 안전하지 않은 네트워크를 통해 메시지를 보낼 때 자신에게 군대가 있다는 것을 증명해야 한다는 것이었습니다. 그래야 수신 측에서 그 사람이 실제로 공격할 군대를 가진 장군이라는 것을 알 수 있고, 서로 조정할 수 있습니다.
블록과 논스 (1:04)
따라서 이 원장을 통해 우리는 네트워크에서 트랜잭션을 쏟아붓고 있습니다. 모든 개별 사용자가 자신의 작업을 증명하게 하는 대신, 작업증명을 트랜잭션 블록으로 추상화하고 채굴자가 그 작업을 수행하도록 할 것입니다.
우리는 트랜잭션을 담고 있는 블록을 가져옵니다. 네트워크를 통해 들어오는 모든 것을 이 블록에 로드합니다. 이 블록의 구조를 살펴보면 논스도 포함되어 있습니다. 이 논스를 통해 해시를 조정할 수 있습니다. 이 전체 블록을 가져와 문자열로 변환하고 해싱하면 해시를 얻게 됩니다. 트랜잭션이 변경되면 해시가 변경되지만, 논스를 변경해도 해시가 변경됩니다.
여기서 우리는 약간의 작업을 수행합니다. 무작위 트랜잭션 세트가 있고, 해시가 0으로 시작할 때까지 논스를 변경합니다. 비잔틴 장군에 대한 사이드 퀘스트를 보셨다면, 증명해야 할 임의의 작업량으로 이 선행 0을 선택했다는 것을 아실 겁니다. 따라서 논스는 1, 2, 3, 4와 같이 모든 숫자를 거치며, 선행 0이 나오면 우리는 그것을 유효한 블록이라고 부릅니다.
작업증명의 실제 작동 (3:00)
채굴된 블록을 가져와 해시를 추출하고 해시 함수에 넣으면 선행 0이 있다는 것을 증명할 수 있습니다. 즉, 이 블록에 작업이 수행되었음을 증명할 수 있습니다.
해시 함수는 제한된 리소스인 CPU를 소모합니다. 우리는 선행 0이 있는 해시를 찾기 위해 모든 CPU 성능을 쏟아붓고 있습니다. 일단 찾게 되면 유효한 블록을 얻게 되며, 해당 블록은 기본적으로 동결됩니다. 당시 그 안에 있던 모든 트랜잭션이 이제 이 블록에 포함되며, 모든 사람이 이를 존중하고 다음 블록으로 넘어갈 수 있습니다.
블록을 체인으로 연결하기 (3:56)
여기에 비결이 있습니다. 이전 블록을 가져와 새 블록에 연결하는 것입니다. 구조를 살펴보면 새 블록에는 트랜잭션이 없고 논스가 비어 있지만, 트랜잭션이 있는 부모 블록이 있습니다. 이전 블록이 다음 블록의 일부가 되므로 전체 체인이 형성됩니다.
트랜잭션 풀에서 최신 트랜잭션을 넣고 논스를 찾는 작업을 합니다. 두 번째 블록이 채굴되었습니다. 이 트랜잭션들을 유효하게 만들려면 10이라는 논스가 필요했습니다. 그런 다음 동일한 작업을 수행합니다. 이전 블록을 연결하고, 새 블록을 가져오고, 최신 트랜잭션이 무엇이든 넣고, 다시 작업합니다. 충분한 시도 끝에 세 번째 블록의 논스를 찾았습니다. 네 번째 블록도 동일한 과정이며, 계속해서 앞으로 나아갑니다.
채굴 난이도 (5:02)
이것은 너무 쉽습니다. 유효한 블록을 매우 빨리 찾을 수 있으므로 더 어렵게 만들고 싶습니다. 난이도를 2로 올리겠습니다. 다섯 번째 블록을 연결하고, 최신 트랜잭션을 가져오고, 카운터가 계속 돌아가게 합니다. 이제 우리는 채굴을 하고 있습니다. 난이도가 올라갔기 때문에 선행 0이 두 개인 해시를 찾을 때까지 제한된 CPU 성능을 사용하여 임의의 해시를 무작위로 던집니다. 시간이 좀 걸릴 것입니다.
이제 5개의 블록으로 구성된 이 블록체인이 생겼습니다. 이 블록들은 트랜잭션을 담고 있으며 각각 이전 블록을 참조합니다. 각 블록을 생성하는 데 임의의 작업량이 필요했으며, 작업량은 난이도에 의해 제어됩니다.
채굴자 (6:46)
채굴자가 무엇인지 살펴보겠습니다. 비잔틴 장군 문제에서 "새벽에 공격"하려는 장군에게는 병사들이 필요했습니다. 각 병사 내부에서 일어나는 일은 우리가 여기서 채굴자와 함께 하는 일과 정확히 같습니다. 메시지와 논스를 가져와 가능한 한 빨리 해시 함수에 던져 선행 0을 얻으려고 노력하는 것입니다. 선행 0은 우리 모두가 동의한 임의의 기준입니다. 이것은 당신이 병사라는 것, 또는 전쟁을 벌일 수 있다는 것을 증명하기에 충분한 작업입니다.
채굴자를 데려와서 이 작업을 조금 더 빨리 해보겠습니다. 채굴자는 우리 블록에 대해 동일한 작업을 수행할 것입니다. 풀에서 들어오는 트랜잭션을 가져와 블록에 주입하고 유효한 해시를 찾을 때까지 계속 작업합니다.
채굴자는 조금 더 효율적입니다. 채굴에 더 집중하고 있죠. 무작위로 해시를 던지고 있습니다. 이것이 바로 이전에 우리 채굴자가 하던 일이며, 단지 추상화되었을 뿐입니다. 백그라운드에서 계속 해시를 생성하며 열심히 작동하는 것을 볼 수 있습니다. 찾았습니다. 여섯 번째 블록이 채굴되었습니다.
이중 지불과 네트워크 전파 (10:00)
이제 이중 지불 문제와 네트워크 전파 문제에 대해 이야기해 보겠습니다. 원장과 분산 네트워크가 있고 누군가 트랜잭션을 보낼 때, 서로 다른 사람들에게 서로 다른 시간에 도달합니다. 따라서 네트워크 상의 두 채굴자가 정확히 같은 시간에 블록을 채굴할 수 있으며, 그 안에는 서로 다른 트랜잭션이 포함될 수 있습니다.
당시에는 각각 유효합니다. 둘 다 작업증명을 수행했고 둘 다 선행 0을 가지고 있습니다. 하지만 둘 다 정식(canonical)이 될 수는 없습니다. 둘 다 진실일 수는 없죠. 따라서 네트워크가 어느 것이 진짜 체인인지에 대해 합의에 도달할 방법이 필요합니다.
다수의 채굴자와 합의 (12:27)
이 블록을 잡고 이쪽으로 옮겨보겠습니다. 제가 원하는 것은 두 명의 다른 채굴자가 같은 문제에 대해 작업하는 것입니다. 같은 트랜잭션 풀을 듣고 독립적으로 블록을 생성하는 것이죠. 맬러리(Mallory)와 마이크(Mike)라는 두 명의 채굴자가 있습니다. 난이도를 3으로 설정했고, 둘 다 선행 0이 세 개인 해시를 찾기 위해 작업하고 있습니다.
맬러리가 먼저 블록을 찾았습니다! 훌륭합니다. 이제 무슨 일이 일어날까요? 우리는 분산 네트워크에 있기 때문에 마이크는 아직 맬러리의 블록에 대해 모를 수도 있습니다. 그는 여전히 자신의 버전을 작업하고 있을 수 있습니다. 그리고 이제 마이크도 하나를 찾았습니다. 따라서 두 개의 유효한 경로가 생겼습니다.
만약 당신이 네트워크의 한 피어이고 맬러리의 블록을 먼저 본다면, 그것이 메인 블록이라고 생각할 것입니다. 그러다 나중에 마이크의 블록이 도착합니다. 둘 중 하나가 가장 긴 체인이 될 경우를 대비해 두 블록을 모두 보관합니다. 그리고 규칙은 '가장 긴 유효한 체인을 따른다'는 것입니다.
코인베이스와 블록 보상 (15:33)
채굴자가 블록을 채굴할 때, 우리는 '여기 우리가 원하는 모든 트랜잭션이 있고, 여기 논스가 있고, 여기 부모가 있다'고 말합니다. 하지만 동시에 '여기 이 블록을 채굴한 사람이 있다'고도 말할 것입니다. 이것을 코인베이스(coinbase)라고 부릅니다. 지금은 그런 이름의 회사가 있는 것 같지만, 그것과는 다릅니다. 우리는 그냥 "채굴자"라고 부르겠습니다. 따라서 이제 우리 블록에는 채굴자 필드가 필요합니다.
마이크가 방금 블록을 찾았고, 마이크는 이로부터 10의 가치를 얻게 될 것입니다. 채굴자들이 이 모든 작업을 수행하도록 장려해야겠죠? 그들은 기본적으로 네트워크를 안전하게 만들기 위해 장비를 구입하는 데 돈을 쓰고 있습니다. 이 채굴자들은 모든 해시 파워를 동원하여 네트워크를 보호하는 데 돈을 쓰고 있습니다. 모든 채굴자를 합치면 아마 수만 명에 달할 것입니다. 그들은 이 해시 작업을 수행하는 장비를 구축하는 데 많은 돈을 지불하고 있으며, 이들에게 동기를 부여하기 위해 채굴하는 각 블록에 대해 블록 보상이라는 몫을 제공합니다.
블록 보상과 인센티브 (16:52)
따라서 이 버전의 블록에서는 맬러리가 10달러를 가지지만, 이 버전에서는 마이크가 10달러를 가집니다. 이 두 플레이어는 각각 자신의 체인을 계속 이어가도록 장려되며, 네트워크의 나머지 부분은 합의를 찾아야 합니다. 기본적으로 누가 가장 긴 유효한 체인을 가지고 있느냐로 귀결됩니다.
마이크는 자신의 블록을 부모로 설정하고 다음 블록 작업을 시작할 것입니다. 맬러리도 똑같이 할 것입니다. 그리고 네트워크의 다른 사람들이 누구의 편을 드느냐에 따라 결정됩니다. 네트워크 상태가 좋지 않은 사람들에게 불이익을 주고 싶지 않기 때문에, 이더리움에서는 엉클 블록(가장 긴 체인에 포함되지 못한 유효한 블록)에도 보상을 지급하는 것으로 알고 있습니다. 왜냐하면 그들 역시 네트워크를 보호하는 데 기여하고 있기 때문입니다.
우리에게는 조정과 합의의 문제가 있었고, 트랜잭션을 유효하게 만들기 위해 수반되어야 하는 임의의 작업량을 부여함으로써 이를 해결했습니다. 맬러리는 이 모든 트랜잭션과 이전 블록의 해시에서 선행 0이 세 개인 것을 찾기 위해 해싱하고 또 해싱하는 모든 작업을 수행했습니다.
블록체인 쿼리 (18:30)
우리는 가장 긴 체인이 무엇이든 그것과 통신할 수 있습니다. 마이크는 아직 7번째로 가지 않았기 때문에 여기서 높이가 여전히 6인 것을 볼 수 있습니다. 그리고 사람들의 잔액을 쿼리하는 것과 같은 작업을 할 수 있습니다. 잔액을 확인해 보면 무엇이 나올까요? 524입니다. 하이디(Heidi)는 524, 혹은 이 체인의 기본 토큰이 무엇이든 그만큼을 보유하고 있었습니다. 우리는 그녀의 논스를 볼 수 있고, 원장으로 할 수 있었던 모든 것을 할 수 있지만, 이제는 블록을 쌓고 있고 그 블록들이 트랜잭션을 담고 있습니다.
우리는 단순히 돈을 보내는 사용자들의 작업을 채굴자들에게 추상화시켰고, 이 블록 보상을 제공함으로써 그들에게 동기를 부여했습니다. 또한 각 사람이 트랜잭션당 지불하는 소액의 금액도 있을 것이지만, 그것은 나중 에피소드에서 다루겠습니다. 지금 당장 가스에 대해 이야기하고 싶지는 않지만, 단순히 블록을 채굴하는 것뿐만 아니라 많은 트랜잭션으로 가득 찬 블록을 채굴하려는 인센티브가 있다는 것을 알아두면 도움이 됩니다. 하지만 그것은 더 작은 인센티브이며, 결국 다루게 될 것입니다.
체인의 불변성 (19:51)
블록이 채굴될수록 점점 더 안전해집니다. 무슨 뜻인지 보여드리겠습니다. 마이크가 블록을 채굴했고, 맬러리는 여기서 데모를 하느라 블록을 채굴하지 못했습니다. 이제 마이크의 체인이 가장 길어질 것이고, 네트워크 전체로 퍼져나갈 것입니다. 모든 사람이 그것을 보고 '좋아, 이 체인에는 7개의 블록이 있고 모두 유효해. 우리가 따를 체인은 이거야'라고 말할 것입니다. 우리가 따르는 규칙이 변경되고 서로 다른 사람들의 그룹이 서로 다른 체인을 따르기를 원하는 하드 포크나 논쟁적인 포크가 발생할 수도 있습니다. 멋진 일이죠.
자, 마지막으로 블록 3으로 돌아가서 무언가를 변경해 보겠습니다. 아주 작은 세부 사항이라도 변경해 보죠. 여기로 들어가 보겠습니다. 프랭크(Frank)에게 가는 트랜잭션이 있습니다. 프랭크 대신 이브(Eve)로 변경한다고 가정해 봅시다. 이제 확인을 누르면 어떻게 되는지 보세요. 저것 좀 보세요. 블록 3의 아주 작은 부분을 변경했는데 갑자기 전체 체인이 무너집니다. 더 이상 유효하지 않습니다. 만약 제가 그것을 네트워크에 브로드캐스트한다면, 사람들은 저를 비웃으며 쫓아낼 것입니다.
블록이 채굴된 후에는 변경된 내용을 다시 채굴하지 않는 한 아무것도 변경할 수 없습니다. 기본적으로 채굴자를 다시 여기에 연결하고 7개의 블록을 가진 마이크를 따라잡을 수 있는 충분한 파워를 확보해야 할 것입니다. 그것은 매우, 매우 어려울 것입니다. 블록이 깊어질수록 되돌리기가 더 어려워집니다. 카를로스(Carlos)가 밥(Bob)에게 84를 보낸 이 블록 3의 경우, 밥은 여러 블록이 쌓여 있으므로 그 돈이 확실히 거기에 있다는 것을 알고 꽤 안심할 수 있습니다. 여기서 논쟁적인 포크가 일어날 가능성은 없습니다. 확고하죠. 이것이 바로 우리가 완결성이라고 부르는 것입니다.
요약 (22:00)
원장과 합의 문제를 겪는 대신, 우리는 작업증명을 사용하여 해시를 생성하고 블록을 검증합니다. 여기서 "유효하다"는 것은 임의의 개수의 선행 0을 의미합니다. 블록의 체인을 구축할 때 채굴된 블록이 실제로 서로 다른 시간에 서로 다른 장소에 도착할 수 있는 문제에 여전히 직면하게 될 것입니다. 따라서 우리는 '유효하고 참여하고자 하는 규칙 세트를 따르는 가장 긴 체인을 따른다'는 추가적인 합의 알고리즘을 가지고 있습니다.
좋습니다, 즐거운 나비넥타이의 금요일입니다! 지금까지 ETH.BUILD의 블록체인이었습니다. 이것을 저장해서 올려둘 테니, 여러분은 그냥 "로드"를 눌러서 가지고 놀 수 있는 체인을 얻으시면 됩니다. 즐거운 금요일 보내세요!