간단한 블록체인 작성
20002 단어 blockchainjavascriptnode
선결 조건
이 문서는 최신 버전의 NodeJS를 설치했고, 적어도 NodeJS에 대해 잘 알고 있다고 가정합니다
JavaScript.
이 글은 원시적인 기본 내용만 토론할 뿐, 스마트 계약, 인터넷, 인터넷 등 더 높은 개념은 언급하지 않을 것이다
분산 발굴.하지만 비트코인 스타일의 작업 증명서를 보여줄 것이다.
소개하다.
만약 당신이 지난 세기에 인터넷을 사용한 개발자라면 비트코인, 인터내셔널 파일 시스템 또는 이더리움 앱을 사용할 수 있다
몇 년 전, 당신은 이미 세계 각지에서 블록체인이라는 단어를 보았을 것입니다.그런데 도대체 뭘까요?
블록체인은 체인 테이블처럼 여겨질 수 있지만 약간의 추가 안전성이 있다.다음 블록을 가리키는 모든 블록을 제외하고는 체인에 제출되면 블록이 어떤 방식으로도 수정하거나 변경할 수 없도록 암호화 서명도 포함된다.이렇게 하면 에 저장된 데이터의 무결성이 보장됩니다.
아니면 100% 아니에요?그래, 우리가 가장 좋은 방법으로 어떻게 일을 하는지 배워보자. 그것을 구축해 보자.
개시하다
먼저 다음 명령을 실행하여 파일 및 폴더 구조를 설정합니다.
$ mkdir simple-blockchain && cd simple-blockchain
$ npm init -y
$ mkdir src && cd src
이것은 새 디렉터리를 만들고, 이 디렉터리에서 NPM 프로젝트를 초기화한 다음, 새로 만든 src 디렉터리로 이동합니다.한 구역
우리의 이야기는 한 동네에서 시작하는 것이 가장 좋다.모든 블록체인이 금융 데이터를 기반으로 하는 것은 아니지만 단일 블록을 양(신용) 또는 마이너스(차용) 비용을 가진 단일 소매거래로 간주하면 이 기본 구축 블록을 이해하는 데 도움이 된다.
우선
block.js
이라는 파일을 만들고 다음 내용으로 채웁시다.class Block {
constructor(options, previousHash = "", difficulty = 3) {
this.options = options;
this.options.nonce = 1;
this.previousHash = previousHash;
}
}
module.exports.Block = Block;
분석해 봅시다.options
매개 변수는 하나의 대상을 받아들일 것이다. 이 대상은 이 블록에 저장된 업무에 대한 상세한 정보를 포함하고previousHash는 저장 체인의 이전 블록의 해시에 사용되며 난이도는 이 블록을 체인에 제출하는 데 필요한 작업량을 결정한다.이 방면의 어려움은 곧 확대될 것이다.같은 이유로 nonce 값을 무시할 수 있습니다.해싱 블록
다음 단계에서는 블록의 내용을 산열하여 암호화 서명을 만들 수 있습니다.만약 당신이 이것이 무엇을 의미하는지 잘 모른다면, 걱정하지 마십시오. 암호화 형식으로 간주하고, 같은 입력을 주면, 출력은 항상 같은 값이나 산열을 포함할 것입니다.이것은 최종적으로 블록이 변경되었는지 확인하는 서명입니다.
우선, Google은 CryptoJS라는 라이브러리를 설치합니다. 이 라이브러리에는 우리가 사용할 해시 함수가 포함되어 있으며,
block.js
파일의 맨 위에 가져옵니다.$ npm install cryptojs
const sha256 = require("crypto-js/sha256");
이제 블록의 컨텐트에서 JSON 문자열을 만들고 값을 산열하는 함수를 도입할 수 있습니다.class Block {
constructor(options, previousHash = "", difficulty = 3) {
this.options = options;
this.options.nonce = 1;
this.previousHash = previousHash;
this.hash = this.calculateHash(difficulty);
}
calculateHash() {
return sha256(
JSON.stringify({ ...this.options, previousHash: this.previousHash })
).toString();
}
}
이 새로운 함수에 대한 호출을 포함하기 위해 구조 함수도 수정했습니다.이 함수는 options
(사무 데이터)과 이전의 산열을 포함하는 새로운 대상을 만들고 생성된 요약을 문자열로 변환하여 사용할 수 있도록 한 다음 대상에 this.hash
으로 저장합니다.작업 증명서
현재 우리는 임의의 블록을 만들 능력이 있지만, 중요한 부분인 작업 증명서가 부족하다.작업 증명은 일종의 메커니즘으로 이 메커니즘을 통해 일정량의 작업을 해야만 블록을 체인에 성공적으로 제출할 수 있다.이 예에서 우리는 비트코인을 빌려 쓸 것이다. 그 중에서 난이도 인자는 산열이 0으로 시작해야 체인에 저장될 수 있는 수량을 반영한다.
만약 우리가 업무 정보를 변경할 수 없고 같은 입력을 할 수 없다면, 해시 출력은 시종일관 같을 것이다. 우리는 어떻게 해야 합니까?이것이 바로 nonce치가 작용하는 곳이다.nonce 값은 무작위 정보 비트일 뿐이며, 논의된 블록과 직접적인 관계가 없으며, 이를 조종하여 새로운 산열을 생성할 수 있습니다.이 과정은 필요한 수량의 0으로 산열될 때까지 반복될 것이다.
이 문제를 처리하기 위해 코드를 추가한 다음 분해합시다.
class Block {
constructor(options, previousHash = "", difficulty = 3) {
this.options = options;
this.options.nonce = 1;
this.previousHash = previousHash;
this.hash = this.mineBlock(difficulty);
}
calculateHash() {
return sha256(
JSON.stringify({ ...this.options, previousHash: this.previousHash })
).toString();
}
mineBlock(difficulty) {
let hashValue = this.calculateHash();
let hashSlice = hashValue.slice(0, difficulty);
let difficultyFactor = "0".repeat(difficulty);
while (hashSlice !== difficultyFactor) {
this.options.nonce++;
hashValue = this.calculateHash();
hashSlice = hashValue.slice(0, difficulty);
}
return hashValue;
}
}
주의해야 할 첫 번째 변화는 구조 함수에서calculateHash 함수를 호출하지 않고 새로운 뇌구 함수를 호출하는 것이다.우리는 먼저 앞의calculateHash 함수를 호출해서 우리의 시작점을 생성합니다. 대부분의 경우, 이 초기 산열은 추가된 최저 요구를 만족시키지 못할 것입니다.다음에 우리는 산열된 앞의 N 문자로 구성된 슬라이스와 N 개의 0을 포함하는 문자열을 만들 것이다. 이 두 가지 상황에서 N은 난이도 인자와 같다.
그리고 이 두 값이 일치하지 않으면 우리는 순환한다.매번 교체할 때마다, 우리는 nonce 값을 1씩 늘린 다음 라운드를 위해 새로운 해시와 새로운 슬라이드를 생성합니다.때로는 수십만 번의 교체가 있어야만 충분한 수량의 0을 생성할 수 있다.우리에게 행운은 현대 컴퓨터의 속도가 매우 빠르다는 것이다
블록체인
이제 블록이 생겼으니 완전한 블록체인을 구축할 수 있습니다.
blockchain.js
이라는 새 파일을 만듭니다.class BlockChain {
constructor() {
this.chain = [];
const block = new Block({
timestamp: new Date().getTime(),
total: 0
});
this.chain.push(block);
}
add(timestamp, total) {
let block = new Block({ timestamp, total }, this.tail().hash);
this.chain.push(block);
}
}
위에서 우리는 두 가지 중요한 일이 발생하고 있다.구조기에서, 우리는 블록마다 저장할 수 있는 그룹을 만들고, 초기 블록을 만든다.이것은 보통 genesis 블록이라고 불린다. 왜냐하면 모든 후속 블록이 의존하는 원시 산열/암호화 서명을 제공하기 때문이다.
dd 함수에서, 우리는 이전에 만든 클래스에서 새 블록을 만들고, 이 클래스는 시간 스탬프와 총수를 받아들인다.그 다음에, 우리는 즉시 함수를 작성하여, 마지막 항목을 체인에서 끌어내고, 그 함수를 새 블록의 이전 해시로 사용할 것이다.
블록 항목 액세스
새 블록을 추가하려면 체인의 끝부분이나 마지막 블록에 접근해서 산열을 이용해야 합니다.이 점을 실현하기 위해 간단한 조수 함수를 계속 만듭시다.이 코드는 해석하기 쉽다.
tail() {
return this.chain[this.chain.length - 1];
}
인증 체인
이 과정에서 가장 중요한 단계는 체인이 왜곡되지 않았는지 확인하는 것이다.다음과 같은 기능을 사용할 수 있습니다.
validate() {
for (let i = 1; i < this.chain.length; i++) {
const current = this.chain[i].calculateHash();
if (this.chain[i].hash !== current) {
return false;
}
if (this.chain[i].previousHash != this.chain[i - 1].hash) {
return false;
}
}
return true;
}
이것은 비교적 긴 함수이지만, 그것의 용도는 단지 두 개뿐이다.우리는 우선 블록의 모든 항목을 교체하기 위해 기본 for () 순환을 사용합니다.기능 고양이에 대해 말하자면, 어떤 형식의 교체를 사용해도 충분히 가능하다.그리고 현재 블록에 대해 해시가 블록에 저장된 내용과 일치하는지 확인합니다.만약 해시가 어떤 방식으로 수정된다면, 발생하는 해시는 달라질 것이며, 우리에게 왜곡을 일깨워 줄 것이다.
마지막으로, 우리는 앞의 산열을 검사해서 그것이 여전히 일치하는지 확인합니다.만약 이 두 조건 중 하나가 실패한다면, 우리는false를 되돌려주고, 이 체인이 무효임을 지적할 것입니다.그렇지 않으면 우리는 진짜 값으로 돌아갈 것이다.
그것을 싸라
모든 것을 테스트하기 위해서, 메인 디렉터리 (src가 아닌) 에 example.js
이라는 파일을 만들고, 다음 코드로 불러옵니다.
const { BlockChain } = require("./src/blockchain");
// Build blockchain with a few items
let blockchain = new BlockChain();
blockchain.add(new Date().getTime(), 15.55);
blockchain.add(new Date().getTime(), 125.55);
blockchain.add(new Date().getTime(), 145.55);
console.log(JSON.stringify(blockchain, null, 4));
// Validate prior to modifying
console.log(blockchain.validate());
// Modify then re-validate
blockchain.chain[2].options.total = "1644.33";
console.log(blockchain.validate());
최종 코드
이 강좌의 최종 코드는 Github에서 찾을 수 있다.
결론
이렇게!100줄 미만의 코드에서 우리는 블록체인의 기본 구축 블록을 구축했고 과정 중의 기본 개념을 더욱 잘 이해하는 데 도움을 주었다.코드에 대한 개선 제안이나 의문이 있으면 저에게 연락 주십시오.
Reference
이 문제에 관하여(간단한 블록체인 작성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/jodylecompte/code-a-simple-blockchain-1k11
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
const { BlockChain } = require("./src/blockchain");
// Build blockchain with a few items
let blockchain = new BlockChain();
blockchain.add(new Date().getTime(), 15.55);
blockchain.add(new Date().getTime(), 125.55);
blockchain.add(new Date().getTime(), 145.55);
console.log(JSON.stringify(blockchain, null, 4));
// Validate prior to modifying
console.log(blockchain.validate());
// Modify then re-validate
blockchain.chain[2].options.total = "1644.33";
console.log(blockchain.validate());
Reference
이 문제에 관하여(간단한 블록체인 작성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jodylecompte/code-a-simple-blockchain-1k11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)