최 전 비트 코 인 블록 체인 구조 + 코드

15966 단어 비트 코 인
  • 1. 블록 체인 서적 과 유용 한 링크 우선, 본인 도 일주일 후에 블록 체인 을 공부 하 는 길에 학습 할 때 자신 이 본 유용 한 정 보 를 자신의 GitHub 에 올 려 서 본인 의 첫 페이지 를 찾기 편 하 게 복습 할 수 있 습 니 다. www. github. com / cancerts / study - blockchain - reference [클릭] 안에 제 가 25 권 (블 로 그 를 쓸 때) 이 있 습 니 다.블록 체인 분야 에서 인기 가 많은 책 은 PDF, mobi 세 가지 형식 이 있 고 블록 체인 의 자체 취 소 를 알 고 있 습 니 다
  • .
  • 2. 블록 체인 구조 와 코드 (JavaScript) 
  • 3. 블록 체인 블록 체인 은 분포 식 장부 로 서 많은 암호학 기술 을 활용 하여 장부 에 기 록 된 데이터 의 안전 을 확보 하고 변경 되 지 않 는 다. 우 리 는 처음에 블록 체인 이라는 개념 이 없 었 고 비트 코 인 하부 조직 데이터 의 형식 에서 제 기 된 것 임 을 알 고 있다. 
  • 4. 블록 첫 번 째 블록 을 창세 블록 (Genesis block) 이 라 고 하 는데 블록 체인 에 포 함 됩 니 다.
    Index
    Timestamp
    Hash
    Previous Hash
    Data
    Nonce
    블록 번호
    타임 스탬프
    sh256
    이전 블록의 hash
    입력 한 내용
    임 의 값
    코드: 
    
    class Block {
      constructor (index, previousHash, timestamp, data, hash, nonce) {
        this.index = index;
        this.previousHash = previousHash;
        this.timestamp = timestamp;
        this.data = data;
        this.hash = hash;
        this.nonce = nonce;
      }
    
      get genesis() {
        new Block(
          0,
          "0",
          1508270000000,
          "Welcome to Blockchain",
          "000dc75a315c77a1f9c98fb6247d03dd18ac52632d7dc6a9920261d8109b37cf",
          604
        );
      }
    }
    
    module.exports = Block;

     

  • 5.
    0, 1, , ,
     
  • 6.
    , Linux ,
     
  • 7.
    :000dc75a315c77a1f9c98fb6247d03dd18ac52632d7dc6a9920261d8109b37cf,
    &&: hash
    &&: hash
    &&:hash
    &&: hash
    &&: hash
     
  • 8.
    hash 0 ,0 , (nonce) hash

     
    
    // cosnt Block = reuqire("./Block.js");
    
    // class Blockchain {
      // constructor() {
        // this.blockchain = [Block.genesis()];
        this.difficulty = 20;
      // }
      
      // get() { ... }
      // get latestBlock() { ... }
    
      isValidHashDifficulty(hash) {
        for (var i = 0; i < hash.length; i++) {
          if (hash[i] !== "0") {
            break;
          };
        }
        return i >= this.difficulty;
      }
    // };
    
    // module.exports = Blockchain;

     

  • 9.
    hash , :hash=f(data)
     
    
    // const Block = require("./Block.js");
    const crypto = require("crypto");
    
    // class Blockchain {
      // constructor() { ... }
      // get() { ... }
      // get latestBlock() { ... }
      // isValidHashDifficulty(hash) { ... }
    
      calculateHashForBlock(block) {
        const { index, previousHash, timestamp, transactions, nonce } = block;
        return this.calculateHash(
          index,
          previousHash,
          timestamp,
          transactions,
          nonce
        );
      }
    
      calculateHash(index, previousHash, timestamp, data, nonce) {
        return crypto
          .createHash("sha256") // SHA256 Hash Function
          .update(index + previousHash + timestamp + data + nonce)
          .digest("hex");
      }
    // };
    
    // module.exports = Blockchain;

     

  • 10.
    hash , hash 0,
     
  • 11.

     
  • 12.

     
  • 13.
    : 100 , 55 , hash ,
     
  • 14.
    , , hash hash

     
    
    // const Block = require("./Block.js");
    // const crypto = require("crypto");
    
    // class Blockchain {
      // constructor() { ... }
      // get() { ... }
      // get latestBlock() { ... }
      // isValidHashDifficulty(hash) { ... }
      // calculateHashForBlock(block) { ... }
      // calculateHash(...) { ... }
    
      mine(data) {
        const newBlock = this.generateNextBlock(data);
        try {
          this.addBlock(newBlock);
        } catch (err) {
          throw err;
        };
      }
    // };
    
    // module.exports = Blockchain;

     

  • 15.
    , , , , , ,

     
    
    // const Block = require("./Block.js");
    // const crypto = require("crypto");
    
    // class Blockchain {
      // constructor() { ... }
      // get() { ... }
      // get latestBlock() { ... }
      // isValidHashDifficulty(hash) { ... }
      // calculateHashForBlock(block) { ... }
      // calculateHash(...) { ... }
      // mine(data) { ... }
    
      generateNextBlock(data) {
        const nextIndex = this.latestBlock.index + 1;
        const previousHash = this.latestBlock.hash;
        let timestamp = new Date().getTime();
        let nonce = 0;
        let nextHash = this.calculateHash(
          nextIndex,
          previousHash,
          timestamp,
          data,
          nonce
        );
    
        while (!this.isValidHashDifficulty(nextHash)) {
          nonce = nonce + 1;
          timestamp = new Date().getTime();
          nextHash = this.calculateHash(
            nextIndex,
            previousHash,
            timestamp,
            data,
            nonce
          );
        }
    
        const nextBlock = new Block(
          nextIndex,
          previousBlock.hash,
          nextTimestamp,
          data,
          nextHash,
          nonce
        );
    
        return nextBlock;
      }
    // };
    
    // module.exports = Blockchain;

     

  • 16.
    , , , 10 , , :12.5+ , ? , , money, , , , , , , 6-8 , , 12.5 , , , ,70 , , ?
     
  • 17.
    , , , , , , , , , , ,

     
    
    // const Block = require("./Block.js");
    // const crypto = require("crypto");
    
    // class Blockchain {
      // constructor() { ... }
      // get() { ... }
      // get latestBlock() { ... }
      // isValidHashDifficulty(hash) { ... }
      // calculateHashForBlock(block) { ... }
      // calculateHash(...) { ... }
      // mine(data) { ... }
      // generateNextBlock(data) { ... }
      // addBlock(newBlock) { ... }
    
      isValidNextBlock(nextBlock, previousBlock) {
        const nextBlockHash = this.calculateHashForBlock(nextBlock);
    
        if (previousBlock.index + 1 !== nextBlock.index) {
          return false;
        } else if (previousBlock.hash !== nextBlock.previousHash) {
          return false;
        } else if (nextBlockHash !== nextBlock.hash) {
          return false;
        } else if (!this.isValidHashDifficulty(nextBlockHash)) {
          return false;
        } else {
          return true;
        }
      }
    // };
    
    // module.exports = Blockchain;

     

  • 18.
    , ,

     
    
    const wrtc = require('wrtc');
    const Exchange = require('peer-exchange');
    const p2p = new Exchange("Blockchain Demo 2.0", { wrtc: wrtc });
    const net = require("net");
    
    class PeerToPeer {
      constructor(blockchain) {
        this.peers = [];
        this.blockchain = blockchain;
      }
    
      startServer(port) {
        const server = net
          .createServer(socket =>
            p2p.accept(socket, (err, conn) => {
              if (err) {
                throw err;
              } else {
                this.initConnection.call(this, conn);
              }
            })
          )
          .listen(port);
      }
    }
      
    module.exports = PeerToPeer;

     

  • 19.


     
    
    // const wrtc = require('wrtc');
    // const Exchange = require('peer-exchange');
    // const p2p = new Exchange(...);
    // const net = require("net");
    
    // class PeerToPeer {
      // constructor(blockchain) { ... }
      // startServer(port) { ... }
      
      discoverPeers() {
        p2p.getNewPeer((err, conn) => {
          if (err) {
            throw err;
          } else {
            this.initConnection.call(this, conn);
          }
        });
      }
    // }
      
    // module.exports = PeerToPeer;

     

  • 20.
    , , , , ,

     
    
    // const wrtc = require('wrtc');
    // const Exchange = require('peer-exchange');
    // const p2p = new Exchange(...);
    // const net = require("net");
    
    // class PeerToPeer {
      // constructor(blockchain) { ... }
      // startServer(port) { ... }
      // discoverPeers() { ... }
    
      connectToPeer(host, port) {
        const socket = net.connect(port, host, () =>
          p2p.connect(socket, (err, conn) => {
            if (err) {
              throw err;
            } else {
              this.initConnection.call(this, conn);
            }
          })
        );
      }
    
      closeConnection() {
        p2p.close(err => {
          throw err;
        })
      }
    // }
    
    // module.exports = PeerToPeer;

     

  • 21.
    , , ,

     
    
    // const wrtc = require('wrtc');
    // const Exchange = require('peer-exchange');
    // const p2p = new Exchange(...);
    // const net = require("net");
    const messageType = {
      REQUEST_LATEST_BLOCK: 0,
      RECEIVE_LATEST_BLOCK: 1,
      REQUEST_BLOCKCHAIN: 2,
      RECEIVE_BLOCKCHAIN: 3,
    };
    const {
      REQUEST_LATEST_BLOCK,
      RECEIVE_LATEST_BLOCK,
      REQUEST_BLOCKCHAIN,
      RECEIVE_BLOCKCHAIN,
      REQUEST_TRANSACTIONS,
      RECEIVE_TRANSACTIONS
    } = messageType;
    
    // class PeerToPeer { ... }
    // module.exports = PeerToPeer;
    
    class Messages {
      static getLatestBlock() {
        return {
          type: REQUEST_LATEST_BLOCK
        };
      }
    
      static sendLatestBlock(block) {
        return {
          type: RECEIVE_LATEST_BLOCK,
          data: block
        };
      }
    
      static getBlockchain() {
        return {
          type: REQUEST_BLOCKCHAIN
        };
      }
    
      static sendBlockchain(blockchain) {
        return {
          type: RECEIVE_BLOCKCHAIN,
          data: blockchain
        };
      }
    }

     

  • 22.

     
    
    // const wrtc = require('wrtc');
    // const Exchange = require('peer-exchange');
    // const p2p = new Exchange(...);
    // const net = require("net");
    // const messageType = { ... };
    // const { ... } = messageType;
    
    // class PeerToPeer {
      // constructor(blockchain) { ... }
      // startServer(port) { ... }
      // discoverPeers() { ... }
      // connectToPeer(host, port) { ... }
      // closeConnection() { ... }
    
      broadcastLatest() {
        this.broadcast(Messages.sendLatestBlock(this.blockchain.latestBlock));
      }
    
      broadcast(message) {
        this.peers.forEach(peer => this.write(peer, message));
      }
    
      write(peer, message) {
        peer.write(JSON.stringify(message));
      }
    
      initConnection(connection) {
        this.peers.push(connection);
        this.initMessageHandler(connection);
        this.initErrorHandler(connection);
        this.write(connection, Messages.getLatestBlock());
      }
    
      initMessageHandler(connection) {
        connection.on("data", data => {
          const message = JSON.parse(data.toString("utf8"));
          this.handleMessage(connection, message);
        });
      }
    
      initErrorHandler(connection) {
        connection.on("error", err => {
          throw err;
        });
      }
    
      handleMessage(peer, message) {
        switch (message.type) {
          case REQUEST_LATEST_BLOCK:
            this.write(peer, Messages.sendLatestBlock(this.blockchain.latestBlock));
            break;
          case REQUEST_BLOCKCHAIN:
            this.write(peer, Messages.sendBlockchain(this.blockchain.get()));
            break;
          case RECEIVE_LATEST_BLOCK:
            this.handleReceivedLatestBlock(message, peer);
            break;
          case RECEIVE_BLOCKCHAIN:
            this.handleReceivedBlockchain(message);
            break;
          default:
            throw "Received invalid message.";
        }
      }
    // }
    
    // module.exports = PeerToPeer;
    // class Messages { ... }

     

  • 23.

     
    
    // const wrtc = require('wrtc');
    // const Exchange = require('peer-exchange');
    // const p2p = new Exchange(...);
    // const net = require("net");
    // const messageType = { ... };
    // const { ... } = messageType;
    
    // class PeerToPeer {
      // constructor(blockchain) { ... }
      // startServer(port) { ... }
      // discoverPeers() { ... }
      // connectToPeer(host, port) { ... }
      // closeConnection() { ... }
      // broadcastLatest() { ... }
      // broadcast(message) { ... }
      // write(peer, message) { ... }
      // initConnection(connection) { ... }
      // initMessageHandler(connection) { ... }
      // initErrorHandler(connection) { ... }
      // handleMessage(peer, message) { ... }
    
      handleReceivedLatestBlock(message, peer) {
        const receivedBlock = message.data;
        const latestBlock = this.blockchain.latestBlock;
    
        if (latestBlock.hash === receivedBlock.previousHash) {
          try {
            this.blockchain.addBlock(receivedBlock);
          } catch(err) {
            throw err;
          }
        } else if (receivedBlock.index > latestBlock.index) {
          this.write(peer, Messages.getBlockchain());
        } else {
          // Do nothing.
        }
      }
    // }
    
    // module.exports = PeerToPeer;
    // class Messages { ... }

     

  • 24.

     
    
    // const wrtc = require('wrtc');
    // const Exchange = require('peer-exchange');
    // const p2p = new Exchange(...);
    // const net = require("net");
    // const messageType = { ... };
    // const { ... } = messageType;
    
    // class PeerToPeer {
      // constructor(blockchain) { ... }
      // startServer(port) { ... }
      // discoverPeers() { ... }
      // connectToPeer(host, port) { ... }
      // closeConnection() { ... }
      // broadcastLatest() { ... }
      // broadcast(message) { ... }
      // write(peer, message) { ... }
      // initConnection(connection) { ... }
      // initMessageHandler(connection) { ... }
      // initErrorHandler(connection) { ... }
      // handleMessage(peer, message) { ... }
    
      handleReceivedLatestBlock(message, peer) {
        // if (latestBlock.hash === receivedBlock.previousHash) {
        // ...
        } else if (receivedBlock.index > latestBlock.index) {
          this.write(peer, Messages.getBlockchain());
        } else {
          // Do nothing.
        }
      }
    
      handleReceivedBlockchain(message) {
        const receivedChain = message.data;
        
        try {
          this.blockchain.replaceChain(receivedChain);
        } catch(err) {
          throw err;
        }
      }
    // }
    
    // module.exports = PeerToPeer;
    // class Messages { ... }

     

  • 25. 51%
    51% 51% , , , 51% , ,
  • 좋은 웹페이지 즐겨찾기