200行代码构建一个区块链

简介:

区块链的基本概念非常简单:一个存储不断增加的有序记录的分布式数据库。然而,当我们谈论区块链时,我们很容易将其与区块链要解决的问题混淆,比如误解为流行的,基于区块链的,像比特币和以太坊一样的项目。术语“区块链”通常与交易,智能合约或加密货币等概念紧密相关。

这必然使得理解区块链变成一项更艰巨的任务,特别是清楚地理解源代码。接下来我将介绍一个我用200行Javascript代码完成的超级简单的区块链:NaiveChain。

区块结构

第一个步骤是确定区块的结构。为了让事情尽可能简单,区块结构只包含最必要的部分:索引,时间戳,数据,散列值(hash)和前一个区块的散列值(hash)。

1620前一个区块的散列值(hash)必须能够在块中找到,这样才能保持链的完整性。
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算法生成这个值。应该指出,这个散列值与“ 挖掘 ” 无关,因为不需要去解决工作证明问题。

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, nextHash);
};

存储区块

使用Javascript数组在内存中存储区块链。区块链的第一个区块总是一个所谓的“创世纪区块”,内容是固定的。

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) + ' ' + newBlock.hash);
        return false;
    }
    return true;
};

选择最长的区块链

区块链中应时刻有且只有一组显式的区块。如果发生冲突(例如,两个节点都生成块号72的区块),我们选择具有最长块数的链。

1620
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');
    }
};

与其他节点通信

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

  • 当一个节点产生一个新块时,要将这个区块广播到网络中。
  • 当一个节点连接到一个新的对等节点时,要查询最新的区块。
  • 当一个节点遇到一个索引大于当前已知块的块时,将该块添加到当前链中,或者查询完整区块链。

1620描述的模型中的一些典型的通信场景

不自动发现对等的节点,必须手动添加对等节点的位置(=网址)。

控制节点

用户必须能够以某种方式控制节点。可以通过设置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:

#从节点获取所有区块
curl http://localhost:3001/blocks

架构

应该注意的是,每个节点实际上公开了两个Web服务器:一个用于控制节点(HTTP服务器),一个用于节点之间的对等通信(Websocket HTTP服务器)

1620 NaiveChain的主要组件

总结

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

您可以从Github存储库获取更多技术细节。

如果您想了解更多区块链的知识,我建议您查看Naivecoin:构建加密货币的教程。在这个教程中,我们将详细讨论如采矿(工作证明),交易和钱包这样的概念。



原文发布时间为:2018-03-15
本文作者:Mr.Crypto
本文来源:腾讯云 云+社区,如需转载请联系原作者。

目录
相关文章
|
1月前
|
供应链 监控 安全
构建未来:区块链技术在供应链管理中的应用
【2月更文挑战第24天】 随着数字化转型的深入发展,区块链技术已从加密货币的阴影下走出,成为创新供应链管理模式的前沿技术。本文将探讨区块链在供应链管理中的具体应用,包括提高透明度、优化库存管理、加强溯源能力以及增进多方信任等方面。通过分析实际案例,我们将揭示区块链技术如何助力企业实现更高效、更安全、更透明的供应链体系。
|
1月前
|
供应链 安全 定位技术
构建未来:区块链技术在供应链管理中的应用
【2月更文挑战第27天】 随着数字化转型的不断深入,区块链技术已从加密货币的阴影中走出,成为推动供应链管理创新的重要力量。本文将探讨区块链如何通过其不可篡改性、透明度和去中心化特性,为供应链管理带来革命性的改变。我们将分析区块链技术在确保产品真实性、提高物流效率以及增强跨境交易信任度方面的应用案例,并讨论这一技术面临的挑战与未来的发展方向。
|
9月前
|
存储 JSON 供应链
使用PHP构建区块链应用程序
区块链技术作为一种去中心化的分布式账本系统,已经引起了广泛的关注。它具有安全、透明、可追溯等特点,被广泛应用于加密货币、供应链管理、身份验证等领域。本文将介绍如何使用PHP构建一个简单的区块链应用程序,并提供相应的代码实现、运行结果和解读。
139 0
|
存储 供应链 安全
谈谈构建区块链的五项重要原则和区块链的典型应用场景
什么是区块链?从科技层面来看,区块链涉及数学、密码学、互联网和计算机编程等很多科学技术问题。
谈谈构建区块链的五项重要原则和区块链的典型应用场景
|
人工智能 JavaScript Oracle
使用 Solidity 和 Node.js 构建简单的区块链预言机
区块链上的预言机是允许区块链世界与来自WEB其余部分的数据交互的框架,将其称为 WEB 2.0 世界。随着智能合约应用的不断扩展,处理独特用例所需的各种数据也将不断扩大。
385 0
使用 Solidity 和 Node.js 构建简单的区块链预言机
|
人工智能 运维 安全
阿里云BaaS:降低区块链应用门槛,用技术构建商业互信
阿里云召开区块链服务(BaaS)商业化发布会,会上对BaaS产品、业务应用场景及生态策略进行了全面解读。
1046 0
阿里云BaaS:降低区块链应用门槛,用技术构建商业互信
|
安全 Serverless 区块链
阿里云BaaS:降低区块链应用门槛,用技术构建商业互信
5月8日,阿里云召开区块链服务(BaaS)商业化发布会,会上对BaaS产品、业务应用场景及生态策略进行了全面解读。对于广大IT服务商和开发者而言,构建区块链应用存在三大痛点问题:成本高,研发投入大、区块链技术平台维护成本高;效益低,企业客户触达困难、解决方案难中标;标准差,没有标准化支撑产品,难以大范围应用到其他客户。
2095 0
阿里云BaaS:降低区块链应用门槛,用技术构建商业互信
|
人工智能 区块链
阿里云区块链+多媒体AI:构建可信数字内容服务,为生态建立互信关系
阿里云多媒体AI基于区块链推出可信数字内容版权服务平台,为版权行业及内容平台客户提供一体化的版权内容保护解决方案。
18838 0
|
JavaScript 安全 区块链
初识区块链——用JS构建你自己的区块链
前言 区块链太复杂,那我们就讲点简单的。用JS来构建你自己的区块链系统,寥寥几行代码就可以说明区块链的底层数据结构、POW挖矿思想和交易过程等。当然了,真实的场景远远远比这复杂。本文的目的仅限于让大家初步了解、初步认识区块链。
1920 0
|
新零售 算法 大数据
软硬件一体提高主链性能,「HPB芯链」想构建区块链版的云计算
HPB芯链是一个区块链软硬件体系架构,其中包含芯片加速引擎和区块链底层平台。
1583 0

热门文章

最新文章