js 实现简单区块链

这篇具有很好参考价值的文章主要介绍了js 实现简单区块链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一步步解决问题,简单写个链,

const SHA256 = require("crypto-js/sha256");

class Block {
  constructor(index, transactions, timestamp, previousHash) {
    this.index = index;
    this.transactions = transactions;
    this.timestamp = timestamp;
    this.previousHash = previousHash;
    this.hash = this.calculateHash();
    this.nonce = 0; //工作量证明
  }
  calculateHash() {
    return SHA256(
      this.index +
        this.previousHash +
        this.timestamp +
        JSON.stringify(this.transactions) +
        this.nonce
    ).toString();
  }
  mineBlock(difficulty) {
    while (
      this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")
    ) {
      this.nonce++;
      this.hash = this.calculateHash();
    }
  }
}

class Blockchain {
  constructor() {
    this.index = 0;
    this.difficulty = 2;
    this.pendingTransactions = [];
    this.miningReward = 200;
    this.chain = [this.createGenesisBlock()];
  }
  createGenesisBlock() {
    let firstBlock = new Block(this.index++, "创世love", new Date(), "我爱你");
    firstBlock.mineBlock(this.difficulty);
    return firstBlock;
  }
  getLatestBlock() {
    return this.chain[this.chain.length - 1];
  }
  createTransaction(transactions) {
    // 这里应该有一些校验!
    // 推入待处理交易数组
    this.pendingTransactions.push(transactions);
  }
  isChainValid() {
    for (let i = 1; i < this.chain.length; i++) {
      const currentBlock = this.chain[i];
      const previousBlock = this.chain[i - 1];
      if (currentBlock.hash !== currentBlock.calculateHash()) {
        return false;
      }
      if (currentBlock.previousHash !== previousBlock.hash) {
        return false;
      }
    }
    return true;
  }
  minePendingTransactions(miningRewardAddress) {
    // 用所有待交易来创建新的区块并且开挖..
    let block = new Block(
      this.index++,
      this.pendingTransactions,
      new Date(),
      this.getLatestBlock().hash
    );
    block.mineBlock(this.difficulty);
    // 将新挖的看矿加入到链上
    this.chain.push(block);
    // 重置待处理交易列表并且发送奖励
    this.pendingTransactions = [
      new Transaction(null, miningRewardAddress, this.miningReward),
    ];
  }

  getBalanceOfAddress(address) {
    let balance = 0; // you start at zero!
    // 遍历每个区块以及每个区块内的交易
    for (const block of this.chain) {
      for (const trans of block.transactions) {
        // 如果地址是发起方 -> 减少余额
        if (trans.fromAddress === address) {
          balance -= trans.amount;
        }
        // 如果地址是接收方 -> 增加余额
        if (trans.toAddress === address) {
          balance += trans.amount;
        }
      }
    }
    return balance;
  }
}

// 交易信息
class Transaction {
  constructor(fromAddress, toAddress, amount) {
    this.fromAddress = fromAddress;
    this.toAddress = toAddress;
    this.amount = amount;
  }
}

let chain1 = new Blockchain();

chain1.createTransaction(new Transaction("anni", "zhanguo", 50));
chain1.createTransaction(new Transaction("anni", "zhanguo", 60));
chain1.createTransaction(new Transaction("anni", "zhanguo", 100));

chain1.minePendingTransactions("anni");

chain1.createTransaction(new Transaction("anni", "zhanguo", 50));
chain1.createTransaction(new Transaction("anni", "zhanguo", 60));
chain1.createTransaction(new Transaction("anni", "zhanguo", 100));

chain1.minePendingTransactions("anni");

chain1.minePendingTransactions("anni");

console.log(
  chain1.chain,
  chain1.getBalanceOfAddress("anni"),
  chain1.getBalanceOfAddress("zhanguo")
);

文章来源地址https://www.toymoban.com/news/detail-537497.html

到了这里,关于js 实现简单区块链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Ganache,web3js和remix在个人区块链上部署并调用合约

    Ganache是一个运行在本地的个人区块链,适用于以太坊的开发者。 首先我们需要下载Ganache web3js的中文文档 remix英文版的网址 有以上的准备之后我们就可以开始了 首先启动Ganache 这就是Ganache的主页面,下面有10个供我们使用的账号,上面有他们的地址以及余额,我们暂时需要

    2024年01月19日
    浏览(74)
  • 使用Web3.js与OKX Web3钱包进行交互:实现去中心化应用的无缝连接

    随着Web3.0技术的不断发展,越来越多的开发者开始探索如何利用去中心化钱包与区块链网络进行交互。在这篇文章中,我们将深入探讨如何通过Web3.js库来连接和操作OKX Web3钱包,以实现对加密货币、NFT以及链上智能合约的管理和交易。 Web3.js 是一个由以太坊社区开发的核心

    2024年02月19日
    浏览(47)
  • js 实现简单区块链

    一步步解决问题,简单写个链,

    2024年02月13日
    浏览(24)
  • 使用nodejs和web3js实现链接metamask钱包并实现合约交互

    在以太坊区块链上,metamask钱包是一个非常常用的钱包,用以管理以太币和其他以太坊资产。同时,它也是一个重要的以太坊智能合约交互工具。在本文中,我们将介绍如何使用nodejs和web3js实现链接metamask钱包并实现合约交互。 在开始之前,首先需要安装NodeJS和Web3JS。 NodeJS是

    2024年02月04日
    浏览(83)
  • 使用Node.js和Web3.js实现链接MetaMask钱包并批量创建钱包并且批量发送代币

    MetaMask是一款基于浏览器的插件钱包,它可以安全地存储、发送和接收以太坊(Ethereum)代币。而Web3.js是一款JavaScript库,可以通过它连接以太坊区块链网络并管理以太坊钱包。 在此文中,我们将学习如何使用Node.js和Web3.js编程语言编写代码,实现链接MetaMask钱包并批量创建钱

    2024年02月08日
    浏览(73)
  • ThreeJS-VUE-3DMax 实现Web3D(简单测试)

            今天使用3DMax建模软件进行3D模型的制作,并且加入动画,通过threejs将模型及其动画部署在VUE框架上。         1. VUE:3.3.4         2. threejs:0.158.0         3. vite:4.4.11         4. 3DMax2021         5. pycharm2021专业版         简单制作一个小植物和一个水壶,实现浇

    2024年02月03日
    浏览(47)
  • Web3和区块链入门——Web3历史和Web3是什么?

    大家好,我是无用,今天跟大家聊下Web3历史和Web3什么。 Web3历史 Web3.0一词最初由英国计算机科学家蒂姆·伯纳斯-李(著名的万维网之父)在1998年提出,但是他那个时候所说的Web3.0是自己所提出的语义网络,他认为语义网络是下一代互联网发展的主流方向。 不过我们现在所说

    2024年02月12日
    浏览(59)
  • 什么是web3 | 区块链web3.0人才

    20世纪90年代互联网刚刚兴起之时,我们只能在网络上查看由中心节点单向发布的新闻,用户只是被动的接受。这个时代,我们称之为web1.0。 千禧年之后,互联网技术进入了可读可写的阶段,用户可以发布照片、文字、视频,这就是传说中的web2。 Web 2.0带来了社会互联,产生

    2024年02月03日
    浏览(53)
  • 区块链-Web3.0-什么是Web3.0?

    一、什么是Web 3.0 Web 3.0,也被称为“去中心化Web”或“智能Web”,是互联网的下一代,它使用了分布式系统技术、区块链技术和智能合约等新型技术,旨在构建一个更加去中心化、安全、透明和智能的互联网。Web 3.0 可以带来更广泛的应用场景,例如去中心化应用(DApps)、去

    2024年02月11日
    浏览(49)
  • 【Web3】认识区块链

    目录 区块链特征 区块链类型 区块链的概念 区块链特征 去中心化:区块链是由一个分布在多个参与者之间的网络组成,没有中央机构或中介控制整个系统。所有参与者共同维护和验证账本的完整性,减少了单点故障和集中式控制的风险。 共识机制:为了在去中心化环境下达

    2024年02月12日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包