新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > 互联网 > 电子商务

如何用web前端JS代码实现超级简单的区块链

时间:2019-07-04 16:06:42  来源:  作者:

区块链作为下一代颠覆性的核心技术,吸引了很多人的关注,区块链的基本概念非常简单:一个分布式数据库维持不断增长的有序记录列表。然而当我们谈论区块链时,我们也会谈论我们用区块链所要解决的问题,这二者通常很容易弄混淆。流行的基于区块链的项目如比特币和以太坊就是这种情况 。术语“区块链”通常与交易、智能合约或加密货币等概念紧密相关。

如何用web前端JS代码实现超级简单的区块链

 

这使得理解区块链是一项必然要艰巨的任务。特别是源码级别的理解。在这里,我将介绍一个使用200行代码实现的超级简单的区块链——NaiveChain。

块结构

第一个逻辑步骤是确定块结构。为了让事情尽可能简单,我们只包含最必要的:索引(index),时间戳(timestamp),数据(data),哈希(hash)和上一个哈希(previousHash)。

class Block {

constructor(index, previousHash, timestamp, data, hash) {

this.index = index;

this.previousHash = previousHash.toString();

this.timestamp = timestamp;

this.data = data;

this.hash = hash.toString();

}

}

块哈希

该块需要被哈希运算以保持数据的完整性。SHA-256被用来做哈希算法处理块的内容。需要注意的是这个哈希与“挖矿” 无关,因为没有解决工作量证明(Proof Of Work )的问题。

var calculateHash = (index, previousHash, timestamp, data) => {

return CryptoJS.SHA256(index + previousHash + timestamp + data).toString();

};

创建块

要创建一个块,我们必须知道上一个块的哈希,并创建剩余的所需内容(=索引,哈希,数据和时间戳)。块数据是由终端用户提供。

var generateNextBlock = (blockData) => {

var previousBlock = getLatestBlock();

var nextIndex = previousBlock.index + 1;

var nextTimestamp = new Date().getTime() / 1000;

var nextHash = calculateHash(nextIndex, previousBlock.hash, nextTimestamp, blockData);

return new Block(nextIndex, previousBlock.hash, nextTimestamp, blockData, extHash);

};

存储块

内存中的Javascript数组用于存储区块链。区块链的第一个区块也叫“创世纪块(译者著:genesis-block,区块链中的第一个块)”,它是直接写死的。

var getGenesisBlock = () => {

return new Block(0, "0", 1465154705, "my genesis block!!", "816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7");

};

var blockchain = [getGenesisBlock()];

验证块的完整性

在任何时候,我们必须能够验证块或区块链的完整性。特别是当我们从其他节点接收到新块时,并且必须决定是否接受它们。

var isValidNewBlock = (newBlock, previousBlock) => {

if (previousBlock.index + 1 !== newBlock.index) {

console.log('invalid index');

return false;

} else if (previousBlock.hash !== newBlock.previousHash) {

console.log('invalid previoushash');

return false;

} else if (calculateHashForBlock(newBlock) !== newBlock.hash) {

console.log('invalid hash: ' + calculateHashForBlock(newBlock) + ' ' + ewBlock.hash);

return false;

}

return true;

};

选择最长的链

任意时间,链中应始终只有一组块。如果发生冲突(例如下图中两个节点都生成id 为72的块),我们选择具有最长块数的链。

var replaceChain = (newBlocks) => {

if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) {

console.log('Received blockchain is valid. Replacing current blockchain with received blockchain');

blockchain = newBlocks;

broadcast(responseLatestMsg());

} else {

console.log('Received blockchain invalid');

}

};

与其他节点通信

一个节点的最重要的职能是与其他节点共享和同步区块链。以下规则用来保持网络同步。

当一个节点产生一个新块时,它将它广播到网络

当一个节点连接到一个新的节点时,它将查询最新的块

当一个节点遇到一个索引大于当前已知块的块时,它会将该块添加到当前链中,或者查询完整的区块链。

我们暂未实现节点自动发现,必须手动添加对等点的位置(=URLs)。

控制节点

用户必须能够以某种方式控制节点。这是通过设置HTTP服务器完成的。

var initHttpServer = () => {

var app = express();

app.use(bodyParser.json());

app.get('/blocks', (req, res) => res.send(JSON.stringify(blockchain)));

app.post('/mineBlock', (req, res) => {

var newBlock = generateNextBlock(req.body.data);

addBlock(newBlock);

broadcast(responseLatestMsg());

console.log('block added: ' + JSON.stringify(newBlock));

res.send();

});

app.get('/peers', (req, res) => {

res.send(sockets.map(s => s._socket.remoteAddress + ':' + s._socket.remotePort));

});

app.post('/addPeer', (req, res) => {

connectToPeers([req.body.peer]);

res.send();

});

app.listen(http_port, () => console.log('Listening http on port: ' + http_port));

};

如上所示,用户能够通过以下方式与节点交互:

列出所有的块

用用户给出的内容创建一个新块

列出或添加节点

控制节点最直接的方法是使用Curl:

#get all blocks from the node

curl http://localhost:3001/blocks

架构

值得注意的是,一个节点实际上暴露了两个web服务器:一个用于控制节点(HTTP服务器),一个用于节点之间的点对点通信(Websocket HTTP服务器)。

结论

NaiveChain是为演示和学习目的而创建的。因为它不具有“挖矿”算法(PoS 或者 PoW),不能在公共网络中使用。尽管如此,它仍然实现了功能区块链的基本功能。

web前端的功能远不止这些,想学习更多web前端知识,可以关注“武汉千锋“微信公众号,获取两周免费试听资格!



Tags:区块链   点击:()  评论:()
声明:本站部分内容来自互联网,如有任何版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
李强(化名)至今还不愿相信自己居然也踩了雷。“我是个比特币的矿工,自认看过了上百个资金盘,也绕过了很多坑。没想到最后还是栽在了波场(超级)社区。”继80万会员注册的Tokenstore...【详细内容】
2019-07-10   区块链  点击:(11)  评论:(0)  加入收藏
区块链作为下一代颠覆性的核心技术,吸引了很多人的关注,区块链的基本概念非常简单:一个分布式数据库维持不断增长的有序记录列表。然而当我们谈论区块链时,我们也会谈论我们用区...【详细内容】
2019-07-04   区块链  点击:(8)  评论:(0)  加入收藏
区块链作为下一代颠覆性的核心技术,吸引了很多人的关注,区块链的基本概念非常简单:一个分布式数据库维持不断增长的有序记录列表。然而当我们谈论区块链时,我们也会谈论我们用区...【详细内容】
2019-07-04   区块链  点击:(6)  评论:(0)  加入收藏
区块链在今年合法了!还是国家备案的那种,然而这个头一开,什么工商农士银行,网易,阿里,腾讯,也都来分一杯羹,可谓八仙过海各显神通。而各级政府也是对于区块链这一新兴产业也是大力扶...【详细内容】
2019-06-19   区块链  点击:(5)  评论:(0)  加入收藏
很多人错过早期比特币,以太坊,非常后悔,于是被传销者看重了这种心理,向其宣传这是一个百倍千倍项目,忽悠人购买。 不过有些真正的区块链项目也是这样宣传的,神化区块链,或者过分夸...【详细内容】
2019-06-18   区块链  点击:(8)  评论:(0)  加入收藏
有些人啊,有点代码技术,再拉点有背景人物,就说我要做1C0,我要给大家一种加密货币,然后开始收以太坊或者其他加密货币兑钱,对于很多区块链行业新手而言,他发的币到底是真的假的呢?下...【详细内容】
2019-06-18   区块链  点击:(7)  评论:(0)  加入收藏
当以云计算、大数据、物联网等技术为代表的新一代信息技术正在各个领域中得到广泛应用的时候,区块链技术作为又一项信息技术正越来越引发人们的关注。完备可追溯、去中心化...【详细内容】
2019-06-18   区块链  点击:(8)  评论:(0)  加入收藏
本文由Rehoo团队Tin原创,无授权禁转!(图片来自网络) 每个人都听过区块链,安全性,安全物联网数据,加密货币等所有术语。但这些技术的普及程度一直在上升,并将继续成为未来的问题。...【详细内容】
2019-06-18   区块链  点击:(10)  评论:(0)  加入收藏
简单地说,区块链是一种新的信息存储方式。可以将其看作是区块链网络上的用户(称为节点)拥有的共享虚拟分类账。对账簿的任何修改,例如,如果有人转移资金或更新一份法律合同,都要...【详细内容】
2019-06-17   区块链  点击:(8)  评论:(0)  加入收藏
摘要:Balaji S. Srinivasan是Coinbase前首席技术官、安德森•霍洛维茨基金(AndreessenHorowitz)董事会合伙人、CoinDesk咨询委员会成员。本文最初发表在《共识》杂志上,并...【详细内容】
2019-05-15   区块链  点击:(15)  评论:(0)  加入收藏
在《科技想要什么》中,凯文·凯利谈到:科技不是由线路和金属构成的一团乱麻,而是有生命力的自然形成的系统,它的起源完全可以回溯到生命的初始时期。正如生物进化呈现出无...【详细内容】
2019-04-24   区块链  点击:(10)  评论:(0)  加入收藏
区块链技术实际上是重构商业模式的技术基础,只是在新的生产力关系之下,价值创造的模式也发生了改变。随着主流加密货币价格波动的大肆宣传,人们很容易将注意力完全集中在加密货币的投资潜力上。...【详细内容】
2019-04-22   区块链  点击:(14)  评论:(0)  加入收藏
区块链技术所承载的延伸意义已经远远超出了加密货币这个范畴。区块链让人们可以在没有中央权威机构的情况下,对互相协作的彼此建立起信心。简单地说,它是一台创造信任的机器,是实现互联网向价值互联网转变的基础设施。 ...【详细内容】
2019-04-04   区块链  点击:(18)  评论:(0)  加入收藏
推荐资讯
相关文章
栏目更新
栏目热门