广告
返回顶部
首页 > 资讯 > 前端开发 > html >Javascript中怎么实现一个小型区块链
  • 851
分享到

Javascript中怎么实现一个小型区块链

2024-04-02 19:04:59 851人浏览 安东尼
摘要

本篇文章为大家展示了javascript中怎么实现一个小型区块链,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。区块链概念狭义:区块链是一种按照时间顺序将数据区块以顺

本篇文章为大家展示了javascript中怎么实现一个小型区块链,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

区块链概念

狭义:区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码方式保证的不可篡改和不可伪造的分布式账本。

一、挖矿(产生新区块)

首先,区块链是由每一个区块联系而形成的,在产生新区块之前必须先有一个最初始的区块,这个区块也叫创世区块。通过这个创世区块,不停地通过变化随机数(nonce)来计算出符合条件的区块。以下是创世区块基本信息:

const initBlock = {      index: 0,      data: 'hey,this is a block chain',      previousHash: '0',      timestamp: '1551806536961',      nonce: 80490,      hash: '0000352fb27dd1141fa7265833190a53e5776b1111e275db0d9a77bf840081e6'  };
  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2.   index:是指每个区块的序号

  3.   data: 这里存放着区块中所有的信息,例如转账,余额等数据

  4.   previousHash: 指的是上一个区块的hash值,创世区块没有上一个,显示0即可

  5.   timestamp:指的是创建这个区块的时间

  6.   nonce:这个是随机数,挖矿就是通过不停变换这个nonce来计算出符合条件的哈希。

  7.   hash: 本区块的hash值,通过前面5个字段的信息进行hash运算得出的值。

接着,通过不停的hash运算计算出符合条件的哈希,即挖矿。挖矿也可以调节难度的大小,例如算出的哈希值必须前3位数必须为1或者末3位数必须为1等等,这个可以自行的去定义,只要***留一个控制的开关,方便控制即可。可以在定义一个变量

哈希的计算:

.createHash('sha256')   .update(index + data + previousHash + timestamp + nonce)   .digest('hex')
_that.difficulty = 3 // 即前3位或者末3位数必须为1,数量越多难度越大

生成了符合条件的hash之后,则产生了新的区块,但是还要对这个区块进行校验看看是否有效,因为可能这是一个被篡改的非法的区块,也有可能和这个链没有任何关系的区块而仅仅只是符合上述哈希的规则而已。所以,需要进行一下校验,,前后区块的有效性。

isValidaBlock(newBlock,lastBlock) {       if (newBlock.index !== lastBlock.index+1) return false       if (newBlock.previousHash !== lastBlock.hash) return false       if (newBlock.timestamp <= lastBlock.timestamp) return false       if (newBlock.hash.slice(1 ,_that.difficulty) !== '1'.repeat(_that.difficulty)) return false       if (newBlock.hash !== this.computeHashForBlock(newBlock)) return false  //确保随机数正确          // 都满足则返回true          return true      }

除了上面的校验之外,还需要使用上面这个函数对整一个chain进行一个每一个块的校验,以保证每一个块的信息是正确的,是没有被篡改过的是合法的。

二、构建P2P网络

区块链的网络是去中心化的,即没有中心服务器的网络,客户端不需要依赖中心服务器来获取或者处理数据。区块链网络中,有这许许多多的节点,每个节点都是一个独立的成员,他们既是客户端也是服务器,节点与节点直接都是点对点进行连接(peer-to-peer),不需要通过某一个中心服务器进行中转,所以,信息安全的角度来说,点对点的连接方式对信息私密性是非常可靠的。

Javascript中怎么实现一个小型区块链

虽然,区块链是通过点对点的连接方式进行数据传输,但是,在这之前还需要一个东西作为引导,这个就是种子节点。因为,两个节点之间他们可能不是处在同一个域下,他们之间想要联系,必须有一方知道对方的ip和端口,这样才能和对方联系上。节点ip和端口号,在这个节点创建出来之后,种子节点就会发给它在这个区块链中所有节点的ip和端口号同时记录下这个新伙伴的ip和端口号。那么,新的节点拿到了这一份"通讯录"之后,就会给这个"通讯录"中的所有小伙伴发个消息,告诉他们有一位新的小伙伴加入,之后,其他节点收到了这个信息,也会在自己的"通讯录"中加上新伙伴的ip和端口号,相当于加入了白名单。这样新的节点接下来就可以和任意的的节点进行通信了。

下面用代码演示一下:

(res)=>{    _that.remotePeerInfo = res.data.data   //1    _that.addPeersList(res.peersList)             //2    _that.boardCast(_that.remotePeerInfo)    //3    _that.blockChainUpdate(blockChain,blockData)     //4  }  addPeersList(peers) {      peers.forEach(peer => {          if (!_that.peers.find(v => _that.isEqualPeer(peer, v))) {              _that.peers.push(peer)          }      })  }  boardCast(remotePeerInfo) {      this.peers.forEach(v => {          this.send(action, v.port, v.address)      })  }  blockChainUpdate(blockChain,blockData){    if(newChain.length === 1 ){      return      }      if(_that.isValidaChain(newChain) && newChain.length>_that.blockchain.length){      _that.blockchain = Object.assign({}, newChain)      }else{      console.log('error')      return      }      if (trans.every(v => _that.isValidTransfer(v))) {      _that.data = trans      } }

1.保存种子节点传来的此新节点的信息包括ip和端口号,因为,新节点的ip和端口号是会有改变的情况。

2.接受种子节点传来的节点列表,将列表的节点遍历检查一下,没有相同的就写进列表中。

3.将新节点的信息广播到所有的节点上,同时接受到信息的节点更新一下节点列表

4.将区块链上信息同步一份都本地,同时对种子节点传来的blockchain进行每个区块的信息

三、转账交易

BTC的交易模型是使用的是UTXO。

Javascript中怎么实现一个小型区块链

在区块链中,进行记录转账交易的时候是需要一个加密的算法,把所有的信息进行加密之后再push到新区块中的data中,从而完成一笔新交易的记录。以BTC为例,BTC的加密算法是使用elliptic这个加密算法,elliptic是一个非对称性的加密算法,非对称的加密算法的特点就是,私钥是惟一的,只有拥有者才可以和他私钥对应的公钥进行校验 。 nodejs也有对应的库在GitHub上搜索elliptic即可。

{    "privateKey": "34a425df3eb1f22fb6cb74b0e7298b16ffd7f3fb",    "publicKey": "ac208623a38d2906b090dbcf3a09378dfe79b77bf39c2b753ef98ea94fe08dc3995a1bd05c917"  }

上面是一个生成好的密钥对格式,仅作为展示,我删减了一部分长度。

使用银行卡进行转账交易的时候,会有一个转出的账号和一个转入的账号,在区块链中的记账也会有这个账号,这个账号就是上面使用生成的密钥对中的公钥,公钥就是地址,或者说公钥代表的就是自己的钱包。

校验的方法,首先使用字段“from”,“to”,“amount”的参数进行sign签名,然后在每次挖矿(记账)的时候,则使用verify(),通过前面的三个参数,和sig进行校验

verify(type,data){      swtich(type){          case 'sign':              const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)              let signature = Buffer.from(keypair.sign(bufferMsg).toDER()).toString('hex')                 this.signature =  signature          break;          case 'verify':               const keypairTemp = ec.keyFromPublic(pub, 'hex')                  const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)               this.keypair = keypairTemp.verify(bufferMsg, sig)          break;          default;      }  }

转帐的时候需要3步,分别是校验转出账户是否有足够的金额,转出账户就是本地公钥。如有则进行记账并且使用两个地址、金额、时间,还有签名加密打包,之后进行全节点广播。其他节点收到这个信息之后***件事也是对新区块的有效性做一个校验,通过校验之后就会写入data中。

transfer(data)  {      const timestamp = new Date().getTime()      const sig = rsa.sign({data.from, data.to, data.amount , timestamp})      const sigTrans = {data.from, data.to, data.amount ,timestamp, sig }           // 非创世区块      if (trans.from !== '0') {              // 检验余额          if (!(_that.blance < amount)) { //_that.blance 当前账户余额              //全节点广播              _that.send('trans', sigTrans)          }else{              console.log('not enough blance')              return          }      }      this.data.push(sigTrans)      return sigTrans  }

其他节点收到消息之后,先进行去重校验,然后再更新数据。

四、查询余额

这个链的查询方法比较简单,就是将区块中的每一条交易的信息进行校验和匹配,满足条件的就进行增减,同时忽略精度上的问题。

this.blance = blance(address)  blance(address) {         let blance = 0;         this.blockchain.forEach(block => {             block.data.forEach(trans => {                 if (address == trans.from) {                     blance -= trans.amount                 }                 if (address == trans.to) {                     blance += trans.amount                }             })         });         return blance     }

上述内容就是Javascript中怎么实现一个小型区块链,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网html频道。

--结束END--

本文标题: Javascript中怎么实现一个小型区块链

本文链接: https://www.lsjlt.com/news/70124.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Javascript中怎么实现一个小型区块链
    本篇文章为大家展示了Javascript中怎么实现一个小型区块链,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。区块链概念狭义:区块链是一种按照时间顺序将数据区块以顺...
    99+
    2022-10-19
  • Python中怎么构建一个极小的区块链
    今天就跟大家聊聊有关Python中怎么构建一个极小的区块链,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。区块链以比特币(Bitcoin)或其它加密货币按时间顺序公开地记录交易的数字账...
    99+
    2023-06-17
  • 使用python怎么实现一个区块链结构
    这期内容当中小编将会给大家带来有关使用python怎么实现一个区块链结构,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)...
    99+
    2023-06-14
  • 如何实现一个简单的区块链
    这篇文章将为大家详细讲解有关如何实现一个简单的区块链,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。区块链的基础概念很简单:一个分布式数据库,...
    99+
    2022-10-18
  • 【Python】实现一个简单的区块链系统
    本文章利用 Python 实现一个简单的功能较为完善的区块链系统(包括区块链结构、账户、钱包、转账),采用的共识机制是 POW。 一、区块与区块链结构 Block.py import hashlibfrom datetime import ...
    99+
    2023-09-22
    区块链 python 共识算法
  • 怎么用go语言区块链实战实现简单的区块与区块链
    本篇内容介绍了“怎么用go语言区块链实战实现简单的区块与区块链”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!区块链实战字节字段说明4版本区块...
    99+
    2023-06-25
  • javascript原型链怎么实现
    这篇文章主要讲解了“javascript原型链怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript原型链怎么实现”吧!原型链在ES6中引入了class关键字,但是JS依...
    99+
    2023-06-22
  • Javascript中怎么实现原型和原型链
    今天就跟大家聊聊有关Javascript中怎么实现原型和原型链,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。原型Javascript中有一句话,叫一...
    99+
    2022-10-19
  • 怎么在小程序中实现一个滑动块效果
    这期内容当中小编将会给大家带来有关怎么在小程序中实现一个滑动块效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。小程序的css样式.box {    wi...
    99+
    2023-06-14
  • JavaScript中怎么实现原型链和继承
    JavaScript中怎么实现原型链和继承,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。原型链例子(要点写在注释里,可以把代码复制到浏览器里测...
    99+
    2022-10-19
  • 怎么在javascript中实现原型链继承
    本篇文章给大家分享的是有关怎么在javascript中实现原型链继承,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、说明构造函数、原型与实例的关系,每个构造函数都有一个原型对...
    99+
    2023-06-15
  • 怎么用Javascript实现一个转盘小游戏
    本篇内容主要讲解“怎么用Javascript实现一个转盘小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Javascript实现一个转盘小游戏”吧!前...
    99+
    2022-10-19
  • 基于JS怎么实现一个小型编译器
    这篇文章主要讲解了“基于JS怎么实现一个小型编译器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于JS怎么实现一个小型编译器”吧!前言the-super-tiny-compiler&nbs...
    99+
    2023-06-30
  • C++中怎么实现一个单向链表
    C++中怎么实现一个单向链表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C++单向链表实现代码:#include < iostream>&...
    99+
    2023-06-17
  • 区块链使用xbench测试xuperchain怎么实现
    要使用XBench测试XuperChain,可以按照以下步骤进行实现: 安装XBench:首先,需要在您的机器上安装XBench...
    99+
    2023-10-23
    区块链 xbench
  • Android中怎么实现一个计步模块
    本篇文章给大家分享的是有关Android中怎么实现一个计步模块,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。目前android计步有两种方式系统计步芯片在Android4.4版...
    99+
    2023-05-31
    android
  • Node.js中怎么实现一个模块系统
    Node.js中怎么实现一个模块系统,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Node.js模块系统为了让Node.js的文件可以相互...
    99+
    2022-10-19
  • nginx中怎么实现一个事件模块
    nginx中怎么实现一个事件模块,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. ngx_events_block()----events配置块解析  &...
    99+
    2023-06-19
  • JavaScript中怎么实现一个队列
    JavaScript中怎么实现一个队列,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.  队列数据结构如果你喜欢四处旅行,肯定在火...
    99+
    2022-10-19
  • node中怎么实现一个http小爬虫
    这篇文章给大家介绍node中怎么实现一个http小爬虫,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。爬取Node.js 教程首页的所有数据建立node-http.js,其中代码如下,代...
    99+
    2022-10-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作