手机版

javascript实现小区块链功能

时间:2021-08-26 来源:互联网 编辑:宝哥软件园 浏览:

狭义的区块链概念:区块链是一种按照时间顺序将数据块按顺序组合在一起的链式数据结构,不能被密码篡改和伪造。

一、挖矿(产生新区块)
首先,区块链是通过连接每个区块形成的。在生成新块之前,必须有一个初始块,也称为创世块。通过这个创建块,通过不断改变随机数来计算合格块。以下是创世区块的基本信息:

const initBlock={ index: 0,data: '嘿,这是一个区块链',previousHash: ' 0 ',timestamp: '1551806536961 ',nonce: 80490,has : ' 0000352 FB 27 DD 1141 fa 7265833190 a53e 5776 b 1111 e 275 db 0d 9a 77 BF 88索引:指每个区块的序号。数据:块中的所有信息都存储在这里,如转账、余额等数据。previousHash:指上一个块的哈希值。如果创世区块没有上一个,可以显示为0。时间戳:指创建该块的时间。随机数:这是一个随机数。挖掘是通过不断地转换这个随机数来计算满足要求的散列。Hash:这个块的哈希值,它是根据前五个字段的信息通过哈希运算得到的。然后,通过不停的哈希运算,即挖掘,计算出合格的哈希。挖掘也可以调整难度,比如计算出的哈希值前3位必须是1或者后3位必须是1等。这可以自己定义,只要在末端留一个控制开关以便于控制。您可以定义一个变量

哈希计算:createhash ('sha256 ')。更新(索引数据先前的散列时间戳现时值)。摘要(' hex') _即。难度=3//即前3位或后3位必须为1。数字越多,难度就越大。在生成一个合格的哈希后,会生成一个新的块,但是应该检查这个块是否有效,因为它可能是一个已经被篡改的非法块,也可能是一个与这个链无关但只符合上述哈希规则的块。因此,有必要检查前后块的有效性。

isValidaBlock(newBlock,lastBlock) { if (newBlock.index!==lastBlock.index 1)如果(newBlock.previousHash!==lastBlock.hash)如果(new block . timestamp=last block . timestamp)返回false如果(newBlock.hash.slice(1,_that .困难)!=='1'.repeat(_that .困难))如果(newBlock.hash!==这个。computehashforblock (new block))返回false//确保随机数正确//如果它们都满足,则返回true。}除了上面的验证,还需要使用上面的功能对每个区块进行全链验证,确保每个区块的信息都是正确的,没有被篡改,是合法的。

二、构建P2P网络
区块链的网络是分散的,即没有中心服务器,客户端不需要依靠中心服务器来获取或处理数据。在区块链网络中,有很多节点,每个节点都是一个独立的成员。它们既是客户端,也是服务器。节点直接点对点连接,无需通过中央服务器。因此,从信息安全的角度来看,对等连接对于信息隐私是非常可靠的。

虽然区块链通过点对点连接传输数据,但在此之前,它需要一些东西作为引导,那就是种子节点。因为它们在两个节点之间可能不在同一个域中,所以如果它们想相互联系,必须知道对方的ip和端口,这样它们才能相互联系。节点ip和端口号,在创建这个节点之后,种子节点将向它发送这个区块链中所有节点的ip和端口号,并记录这个新伙伴的ip和端口号。

然后,新节点拿到这个‘通讯录’后,会给这个‘通讯录’里的所有小伙伴发消息,告诉他们有新的小伙伴加入了。之后,其他节点也会在自己的“通讯录”中添加新伙伴的ip和端口号,相当于加入白名单。这样,新节点可以与下一个任何节点通信。

让我们用下面的代码演示一下:

(RES)={ _ that . remote peerinfo=RES . data . data//1 _ that . addPeersList(RES . peerslist)//2 _ that . boardcast(_ that . remote peerinfo)//3 _ that . blockchainupdate(区块链,blockData)//4 } addPeersList(peers){ peers . foreach(peer={ if(!_ that . peers . find(v=_ that . isequalper(peer,v))){ _ that . peers . push(peer)})} boardCast(remote peerinfo){ this . peers . foreach(v={ this . send(action,v.port,v.address) })}blockChainUpdate(区块链,blockData){ if(New chain . length===1){ return } if(_ that . isvalidachain(New chain)New chain . length _ that . block chain . length){ _ that。日志(“错误”)返回} if (trans。每(v=_那个。是有效的转让(v))) {_那。data=trans}} 1。从种子节点保存这个新节点的信息,包括ip和端口号,因为会有新节点的ip和端口号。

2.从种子节点接受节点列表,遍历并检查列表中的节点,如果不相同,则将它们写入列表。

3.将新节点的信息广播给所有节点,同时更新接收信息的节点的节点列表

4.将区块链上的信息同步到本地,并执行从种子节点传输的区块链上的每个块的信息

三、转账交易
BTC的交易模式使用UTXO

这个小区块链的交易模式用的是最简单的方法。

在区块链,现金是一种虚拟的东西或字符串,来自采矿。每一次成功的开采都会得到回报,这些“钱”可以在区块链网络中自由转移和交易。

在区块链,当记录转移交易时,需要一种加密算法,该算法对所有信息进行加密,然后将其推送到新块中的数据,从而完成新交易的记录。以BTC为例,BTC的加密算法是椭圆的,是一种非对称加密算法。非对称加密算法的特点是私钥是唯一的,只有所有者才能用自己私钥对应的公钥进行校验。Nodejs也有相应的库,所以可以在github上搜索椭圆。

{ '私钥' : ' 34 a 425 df 3 EB 1 f 22 FB 6 CB 74 b 0 e 7298 b 16 ffd 7 f3fb ','公钥' : ' AC 208623 a 38d 2906 b 090 BF 3a 09378 dfe 79 b 77 BF 39 C2 b 753 ef 98 ea 94 Fe 08 DC 3995 a1 BD 05 c

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

验证方法,首先使用“from”、“to”和“amount”三个参数进行签名,然后在挖掘(核算)时通过前三个参数使用verify()与sig进行验证。

验证(类型,数据){ swtich(类型){ case ' sign ' : const buffer msg=buffer . from(` $ { data . from }-$ { data . to }-$ { data . amount } `)让signature=buffer . from(key air . sign(buffer msg)。toDER())。toString(' hex ')this . signature=signature break;case ' verify ' : const KeyAirTemp=EC . KeyFromPublic(pub,' hex ')const buffer msg=buffer . from(` $ { data . from }-$ { data . to }-$ { data . amount } `)this . KeyAir=KeyAirTemp . verify(buffer msg,SIG)break;违约;}}转账时有三个步骤,分别是验证转出账户是否有足够的资金,这是本地公钥。如果有,就保留账号,加密后用两个地址打包,金额、时间、签名,然后在整个节点广播。其他节点收到此信息后,首先要检查新块的有效性,检查通过后会写入数据。

传输(数据){常量时间戳=新日期()。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活期账户余额//broadcast _that.send('trans ',SIGTrans)} else {console.log('不够平衡')return } } this . data . push(SIGTrans)return SIGTrans }收到消息后,其他节点首先执行重复数据消除检查,然后更新数据。

四、查询余额
链的查询方法比较简单,就是检查匹配块中每一笔交易的信息,满足条件就增减,而忽略了准确性问题。

this.blance=blance(地址)blance(地址){让blance=0;this . block chain . foreach(block={ block . data . foreach(trans={ if(address==trans . from){ blance-=trans . amount } if(address==trans . to){ blance=trans . amount } })});至此,区块链最简单的功能实现了。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。

版权声明:javascript实现小区块链功能是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。