Node.js에서 간단한 암호화폐 블록체인을 구축하는 방법

게시 됨: 2022-03-10
빠른 요약 ↬ 이 튜토리얼은 JavaScript 클래스와 Node.js의 개념을 사용하여 smashingCoin 코인이라는 간단한 암호화폐를 만드는 방법을 보여줍니다. 시도해 보세요. 생각보다 간단합니다!

암호 화폐의 전례 없는 부상과 이를 뒷받침하는 블록체인 기술은 10년 전에 학문적 개념으로 시작되었던 겸손한 시작에서 현재 다양한 산업에서 채택이 증가하는 것에 이르기까지 전 세계를 폭풍으로 몰아넣었습니다.

블록체인 기술은 무신뢰 환경에서 보안을 강화하고, 탈중앙화를 시행하며, 프로세스를 효율적으로 만드는 능력 때문에 많은 주목을 받고 있습니다.

전통적으로 Python은 블록체인 개발을 위한 사실상의 프로그래밍 언어였습니다. 그러나 이 놀라운 기술의 확산으로 개발 옵션도 증가했으며 Node.js도 뒤쳐지지 않았습니다.

이 튜토리얼에서는 Node.js에서 간단한 암호화폐 블록체인을 구축하는 방법에 대해 이야기할 것입니다. 너무 화려하지는 않지만 블록체인이 작동하는 방식을 이해하는 데 도움이 되기에 충분합니다.

나는 이것을 간단한 암호화폐 smashingCoin 코인이라고 부를 것이다.

급성장하는 암호화폐 분야로 도약하고자 하는 JavaScript 개발자라면 이 기사를 통해 시작하는 데 필요한 기술을 습득할 수 있습니다. 또는 암호 화폐 세계에서 작동하는 방식에 대해 궁금한 경우 이 자습서가 몇 가지 질문에 답하는 데 도움이 될 수 있습니다.

추천 자료 : Drew McLellan의 하위 리소스 무결성 이해

전제 조건

이 튜토리얼을 성공적으로 따르려면 다음이 필요합니다.

  • 컴퓨터에 설치된 Node.js. 여기에서 다운로드할 수 있습니다.
  • Visual Studio Code, Sublime Text 또는 기타와 같은 코드 편집기.

시작하자…

점프 후 더! 아래에서 계속 읽기 ↓

블록체인이란?

블록체인은 비트코인 ​​및 이더리움과 같은 디지털 통화를 구동하는 기술입니다. 암호화를 사용하여 안전하게 연결된 블록이라고 하는 지속적으로 증가하는 레코드 목록을 유지 관리하는 혁신적인 분산 공공 장부 기술입니다.

블록체인 이라는 용어는 트랜잭션 데이터를 유지하는 방식, 즉 체인 을 생성하기 위해 서로 연결된 블록 으로 인해 그 이름을 얻었습니다. 블록체인의 크기는 수행되는 트랜잭션 수가 증가함에 따라 커집니다.

유효한 모든 거래 데이터는 참가자가 규정한 P2P 규칙에 따라 관리되는 블록체인 네트워크에 기록됩니다. 예를 들어, 이 데이터에는 디지털 통화와 같은 블록의 "가치", 거래 기록(예: 당사자가 상품 및 서비스를 교환할 때) 또는 체인이 소유권 정보를 기록할 때와 같은 자격 권한이 포함될 수 있습니다.

트랜잭션 데이터 외에도 모든 블록에는 자체 암호화 해시(고유 식별자 또는 디지털 발자국), 자체 임시 값(암호화 계산에서 한 번 사용되는 임의의 난수), 이전 블록의 해시 및 최근 블록의 타임스탬프가 포함될 수 있습니다. 인증된 거래.

모든 새 블록은 이전 블록을 가리켜야 하므로 마지막 블록의 올바른 해시를 포함하지 않고 블록이 체인에 통합되면 전체 블록체인이 무효화될 수 있습니다. 이 불변성 속성은 블록체인 보안의 핵심입니다.

또한 블록체인의 진정성을 유지하기 위해 다양한 유형의 합의 프로토콜이 적용되는 경우가 많습니다. 합의는 모든 참가자가 네트워크에서 검증된 거래에 동의하도록 합니다.

예를 들어 일반적으로 사용되는 합의 프로토콜은 작업 증명으로, 일정량의 컴퓨팅 작업을 완료한 후 복잡한 수학 문제에 대한 솔루션을 찾는 숫자를 식별하는 것을 목표로 합니다.

증명 작업의 주요 아이디어는 블록체인 네트워크의 모든 참가자가 이 번호를 식별하기는 어렵지만 쉽게 확인할 수 있어야 한다는 것입니다. 결과적으로 블록체인 구조에 대한 스팸 및 변조를 방지합니다.

대부분의 암호화폐의 경우 블록체인에 새 블록을 추가하려면 복잡한 수학 방정식을 풀어야 하며, 이는 블록체인이 성장함에 따라 시간이 지남에 따라 난이도가 높아집니다. 결과적으로, 이 문제를 해결하여 작업을 수행했음을 증명하는 사람은 "마이닝"이라고 하는 프로세스에서 디지털 통화로 보상을 받습니다.

블록을 만드는 방법

이제 블록체인 기술과 작동 원리를 소개한 후 블록 생성에 개념을 적용하는 방법을 살펴보겠습니다. 앞서 언급했듯이 블록은 서로 연결되어 블록체인을 형성하는 것입니다.

smashingCoin 화폐를 생성하기 위해 ES6에 도입된 자바스크립트 클래스를 사용할 것입니다.

준비가 된?

손을 더럽히자...

다음은 CryptoBlock 클래스의 코드입니다.

 const SHA256 = require('crypto-js/sha256'); class CryptoBlock{ constructor(index, timestamp, data, precedingHash=" "){ this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); } computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)).toString(); } }

위의 코드에서 볼 수 있듯이 다른 JavaScript 클래스에서와 마찬가지로 CryptoBlock 클래스를 만들고 여기에 constructor() 메서드를 추가했습니다. 그런 다음 속성을 초기화하기 위해 constructor 메서드에 다음 매개변수를 할당했습니다.

index 전체 블록체인에서 모든 블록의 위치를 ​​추적하는 고유 번호입니다.
timestamp 완료된 각 트랜잭션의 발생 시간을 기록합니다.
data 발신자 내역, 수취인 내역, 거래 수량 등 완료된 거래에 대한 데이터를 제공합니다.
precedingHash 이는 블록체인의 무결성을 유지하는 데 중요한 블록체인에서 이전 블록의 해시를 가리킵니다.

또한 위의 데이터에 나와 있는 것처럼 해당 속성을 기반으로 블록의 해시를 계산하기 위해 computeHash 메서드를 사용했습니다.

보시다시피, 저는 crypto-js JavaScript 라이브러리를 가져와서 crypto-js/sha256 모듈을 사용하여 각 블록의 해시를 계산했습니다. 모듈은 숫자 객체를 반환하므로 toString() 메서드를 사용하여 문자열로 변환했습니다.

프로젝트에 crypto-js 라이브러리를 추가하려면 터미널로 이동하고 다음 명령을 실행하여 npm 을 사용하여 설치합니다.

 npm install --save crypto-js

위의 명령을 실행하면 라이브러리 및 기타 필수 파일이 포함된 노드 모듈 디렉터리가 프로젝트 폴더에 추가됩니다.

블록체인을 만드는 방법

앞서 설명한 바와 같이 블록체인 기술은 모든 블록이 서로 연결되어 있다는 개념을 기반으로 합니다. 따라서 전체 체인의 작업을 처리하는 CryptoBlockchain 클래스를 생성해 보겠습니다. 고무가 도로와 만나는 곳입니다.

CryptoBlockchain 클래스는 새 블록을 만들고 체인에 추가하는 것과 같은 다양한 작업을 수행하는 도우미 메서드를 사용하여 블록체인의 작업을 유지합니다.

다음은 CryptoBlockchain 클래스의 코드입니다.

 class CryptoBlockchain{ constructor(){ this.blockchain = [this.startGenesisBlock()]; } startGenesisBlock(){ return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock(){ return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; newBlock.hash = newBlock.computeHash(); this.blockchain.push(newBlock); } }

CryptoBlockchain 클래스를 구성하는 각 도우미 메서드의 역할에 대해 이야기하겠습니다.

1. 생성자 메소드

이 방법은 블록체인을 인스턴스화합니다. 생성자 내부에서 블록 배열을 참조하는 blockchain 속성을 만들었습니다. 체인에 초기 블록을 생성하는 startGenesisBlock() 메서드를 전달했습니다.

2. 제네시스 블록 생성

블록체인에서 제네시스 블록은 네트워크에서 최초로 생성된 블록을 의미합니다. 블록이 나머지 체인과 통합될 때마다 이전 블록을 참조해야 합니다.

반대로, 이 초기 블록의 경우 가리킬 선행 블록이 없습니다. 따라서 제네시스 블록은 일반적으로 블록체인에 하드코딩됩니다. 이런 식으로 후속 블록을 생성할 수 있습니다. 일반적으로 인덱스가 0입니다.

startGenesisBlock() 메서드를 사용하여 제네시스 블록을 생성했습니다. precedingHash 만든 CryptoBlock 클래스를 사용하여 생성하고 index , timestamp , data , previousHash 매개변수를 전달했음을 주목하세요.

3. 최신 블록 얻기

블록체인에서 최신 블록을 가져오면 현재 블록의 해시가 이전 블록의 해시를 가리키도록 하여 체인의 무결성을 유지하는 데 도움이 됩니다.

나는 그것을 검색하기 위해 obtainLatestBlock() 메소드를 사용했습니다.

4. 새 블록 추가

addNewBlock() 메서드를 사용하여 체인에 새 블록을 추가했습니다. 이를 달성하기 위해 새 블록의 이전 해시를 체인의 마지막 블록 해시와 동일하게 설정하여 체인이 변조되지 않도록 합니다.

새 블록의 속성은 새 계산마다 변경되므로 암호화 해시를 다시 계산하는 것이 중요합니다. 해시를 업데이트한 후 새 블록은 블록체인 배열로 푸시됩니다.

실제로 블록체인에 새 블록을 추가하는 것은 여러 가지 검사를 거쳐야 하기 때문에 쉽지 않습니다. 그럼에도 불구하고 이 간단한 암호화폐의 경우 블록체인이 실제로 어떻게 작동하는지 보여주기에 충분합니다.

블록체인 테스트

이제 간단한 블록체인을 테스트하고 작동하는지 확인하겠습니다.

코드는 다음과 같습니다.

 let smashingCoin = new CryptoBlockchain(); smashingCoin.addNewBlock(new CryptoBlock(1, "01/06/2020", {sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50})); smashingCoin.addNewBlock(new CryptoBlock(2, "01/07/2020", {sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100}) ); console.log(JSON.stringify(smashingCoin, null, 4));

위의 코드에서 볼 수 있듯이 CryptoBlockchain 클래스의 새 인스턴스를 만들고 이름을 smashingCoin 으로 지정했습니다. 그런 다음 임의의 값을 사용하여 두 개의 블록을 블록체인에 추가했습니다. data 매개변수에는 개체를 사용하여 보낸 사람 세부 정보, 받는 사람 세부 정보 및 거래 수량을 추가했습니다.

터미널에서 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

블록체인의 내부 모습
블록체인이 작동하는지 테스트합니다. (큰 미리보기)

이것이 smashingCoin 의 모습입니다! 그것은 체인의 모든 블록을 포함하는 배열인 blockchain 속성을 포함하는 객체입니다. 위 이미지에서 볼 수 있듯이 각 블록은 이전 블록의 해시를 참조합니다. 예를 들어, 두 번째 블록은 첫 번째 블록의 해시를 참조합니다. 테스트하고 블록체인이 작동하는지 확인한 후, smashingCoin 의 기능을 향상시키기 위해 몇 가지 기능을 더 추가해 보겠습니다.

블록체인의 무결성을 확인하는 방법

앞서 언급했듯이 블록체인의 주요 특징은 블록이 체인에 추가되면 나머지 체인의 무결성을 무효화하지 않고는 변경할 수 없다는 것입니다.

따라서 블록체인의 무결성을 확인하기 위해 CryptoBlockchain 클래스에 checkChainValidity() 메서드를 추가하겠습니다.

블록의 내용이 변경되면 완전히 새로운 해시가 생성되고 블록체인이 무효화되기 때문에 해시는 블록체인의 유효성과 보안을 보장하는 데 중요합니다.

따라서 checkChainValidity() 메서드는 if 문을 사용하여 모든 블록의 해시가 변조되었는지 여부를 확인합니다. 처음 생성된 블록부터 시작하여 전체 블록체인을 순환하고 유효성을 확인합니다. 제네시스 블록은 하드코딩되었기 때문에 확인되지 않습니다.

또한 이 메서드는 두 개의 연속 블록 각각의 해시가 서로를 가리키는지 여부를 확인합니다. 블록체인의 무결성이 손상되지 않은 경우 true를 반환합니다. 그렇지 않으면 이상이 있는 경우 false를 반환합니다.

코드는 다음과 같습니다.

 checkChainValidity(){ for(let i = 1; i < this.blockchain.length; i++){ const currentBlock = this.blockchain[i]; const precedingBlock= this.blockchain[i-1]; if(currentBlock.hash !== currentBlock.computeHash()){ return false; } if(currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; }

작업 증명을 추가하는 방법

앞서 언급했듯이 작업 증명은 블록체인에 새로운 블록을 추가하거나 채굴할 때 수반되는 어려움을 증가시키기 위해 적용되는 개념입니다.

smashingCoin 의 경우 사람들이 새 블록을 쉽게 생성하거나 블록체인을 스팸하는 것을 막는 간단한 알고리즘을 사용합니다.

따라서 CryptoBlock 클래스에 proofOfWork(). 기본적으로 이 간단한 알고리즘은 모든 블록의 해시에 이 difficulty 에 해당하는 선행 0이 포함되도록 difficulty 속성으로 전달된 숫자를 식별합니다.

모든 블록의 해시가 difficulty 에 설정된 0의 수로 시작하도록 하려면 많은 컴퓨팅 성능이 필요합니다. 난이도가 높을수록 새 블록을 채굴하는 데 더 많은 시간이 걸립니다.

또한 모든 해시된 블록에 임의의 nonce 값을 추가하여 다시 해시할 때 난이도 제한을 계속 충족할 수 있습니다.

코드는 다음과 같습니다.

 proofOfWork(difficulty){ while(this.hash.substring(0, difficulty) !==Array(difficulty + 1).join("0")){ this.nonce++; this.hash = this.computeHash(); } }

그리고 다음은 nonce 변수가 포함된 업데이트된 computeHash() 메서드입니다.

 computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)+this.nonce).toString(); }

또한 새 블록 생성 시 작업 증명 메커니즘을 구현하기 위해 addNewBlock() 메서드에 포함합니다.

 addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); }

마무리

Node.js를 사용하여 smashingCoin 코인 암호화폐를 구축하기 위한 전체 코드는 다음과 같습니다.

 const SHA256 = require("crypto-js/sha256"); class CryptoBlock { constructor(index, timestamp, data, precedingHash = " ") { this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); this.nonce = 0; } computeHash() { return SHA256( this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString(); } proofOfWork(difficulty) { while ( this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0") ) { this.nonce++; this.hash = this.computeHash(); } } } class CryptoBlockchain { constructor() { this.blockchain = [this.startGenesisBlock()]; this.difficulty = 4; } startGenesisBlock() { return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock() { return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock) { newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); } checkChainValidity() { for (let i = 1; i < this.blockchain.length; i++) { const currentBlock = this.blockchain[i]; const precedingBlock = this.blockchain[i - 1]; if (currentBlock.hash !== currentBlock.computeHash()) { return false; } if (currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; } } let smashingCoin = new CryptoBlockchain(); console.log("smashingCoin mining in progress...."); smashingCoin.addNewBlock( new CryptoBlock(1, "01/06/2020", { sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50 }) ); smashingCoin.addNewBlock( new CryptoBlock(2, "01/07/2020", { sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100 }) ); console.log(JSON.stringify(smashingCoin, null, 4));

터미널에서 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

Node.js에서 간단한 암호화폐 생성 출력
드디어 smashingCoin 코인 암호화폐! (큰 미리보기)

위의 이미지에서 볼 수 있듯이 해시는 이제 작업 증명 메커니즘에 설정된 난이도에 해당하는 4개의 0으로 시작합니다.

결론

그게 다야! 이것이 Node.js를 사용하여 간단한 암호화폐 블록체인을 구축하는 방법입니다.

물론 smashingCoin 코인 암호화폐는 완전하지 않습니다. 사실, 더 많은 개선 없이 출시하면 안전하고 신뢰할 수 있으며 직관적인 디지털 통화에 대한 현재 시장 요구를 충족하지 못할 것입니다.

그럼에도 불구하고 이 튜토리얼이 스릴 넘치는 암호화폐 세계에 발을 담그기 위한 몇 가지 기본 기술을 갖추게 되었기를 바랍니다.

의견이나 질문이 있으면 아래에 게시하십시오.

추가 리소스

  • "블록체인 101", 코인데스크
  • "비트코인: P2P 전자 현금 시스템", 사토시 나카모토, Bitcoin.org