200 行代码实现一个简单的区块链

资讯 2024-06-23 阅读:43 评论:0
区块链的基础概念很简单:一个分布式数据库,存储一个不断加长的 list,list 中包含着许多有序的记录。然而,在通常情况下,当我们谈到区块链的时候也会谈起使用区块链来解决的问题,这两者很容易混淆。像流行的比特币和以太坊这样基于区块链的项目...

区块链的基础概念很简单:一个分布式数据库,存储一个不断加长的 list,list 中包含着许多有序的记录。然而,在通常情况下,当我们谈到区块链的时候也会谈起使用区块链来解决的问题,这两者很容易混淆。像流行的比特币和以太坊这样基于区块链的项目就是这样。“区块链”这个术语通常和像交易、智能合约、加密货币这样的概念紧紧联系在一起。

这就令理解区块链变得不必要得复杂起来,特别是当你想理解源码的时候。下面我将通过 200 行 JS 实现的超级简单的区块链来帮助大家理解它,我给这段代码起名为 NaiveChain。

块结构

第一个逻辑步骤是决定块结构。为了保证事情尽可能的简单,我们只选择最必要的部分:index(下标)、timestamp(时间戳)、data(数据)、hash(哈希值)和 previous hash(前置哈希值)。

The basic concept of the block chain is simple: a distributed database containing a growing list of serials contains many orderly records. However, when we talk about the block chain, the question of using the block chain is often easily confused. This is the case with popular bitcoins and block chain-based projects such as Ether. The term “block chain” is usually closely linked to concepts such as transactions, smart contracts, encrypted currencies.
>, which makes it unnecessary to complicate the understanding of the block chain, especially when you want to understand the source code. Next, I will use the 200-line JS super-simple block chain to help people understand it.

1.jpg

这个块中必须能找到前一个块的哈希值,以此来保证整条链的完整性。

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();
};

In this block, the integrity of the entire chain must be assured by the availability of the previous section.

this=timestamp, data, hash) {br/>this=previousHash.index=index;
this.previousHash=previousHash.tostring();
this.timestamp=timeamp;
this.data=data;
this=hash.thash.string;

> > > ; SHA-256 should be encrypted; the value should be recorded; br/ br/ br/ strr/ hrrr/

块的生成

要生成一个块,必须知道前一个块的哈希值,然后创造其余所需的内容(=index, hash, data and timestamp)。块的data部分是由终端用户所提供的。

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号块时),会选择有最大数目的块的链。

generation of block(s) to generate a block(s) that must know the original block(s) and then create the remaining content (=index, hash, data and timestamp).
(br/>vargenerateNextBlock=(blockData)=>
previousBlock=getLestBlockBlock();
nextIndex=paviotBrebrock_brain; ; ; >; ;

2.jpg



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

与其他结点的通信

结点的本质是和其他结点共享和同步区块链,下面的规则能保证网络同步。

当一个结点生成一个新块时,它会在网络上散布这个块。
当一个节点连接新peer时,它会查询最新的block。
当一个结点遇到一个块,其index大于当前所有块的index时,它会添加这个块到它当前的链中,或者到整个区块链中查询这个块。


{br/>consolegen=(newBlocks)= > {br/>if (isValidchain(newBlocks) & & newBlocks.lenth & gt; blockchain.lenth) {br/>consolelog(#39; Received blockchain is valid. Replacing crerent blockchain with received blockchain#39;
blocks & gt;
responteestMsg() > ;

3.jpg


如图为当节点遵循前文所述协议时会发生的一些典型通信场景

我没有采用自动发现peer的工具。peers的位置(URL)必须是手动添加的。

结点控制

在某种程度上用户必须能够控制结点。这一点通过搭建一个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));
};

用户可以用下面的方法和结点互动:

列出所有的块
用用户提供的内容创建一个新的块
列出或者新增peers
下面这个Curl的例子就是最直接的控制结点的方法:


(b) >(b) >(b) >(b) >(b) >(b) >(b)(b)(b) nodes control (b) (b) >(b) >(br) >(b) > (b)TP server(b) (b)
(btt) > );
(bt) > ; ; (blink) ); (blink(blink) ); >(blink(39 ); > (blink) ); (k) > (kt) );

(kt) );

curl http://localhost:3001/blocks

体系结构

需要指出的是,节点实际上展现了两个web服务器:一个(HTTP服务器)是让用户控制节点,另一个(Websocket HTTP服务器)。

Curl  http://localhost: 3001/blocks

system structure
it should be noted that nodes actually display two web servers: one (HTTP) is a control node for users and the other (Websocket HTTP server).

4.jpg

NaiveChain的主要组成部分

总结

创造 NaiveChain 的目的是为了示范和学习,因为它并没有“挖矿”算法(PoS of PoW),不能被用于公用网络,但是它实现了区块链运作的基本特性。

你可以在 Github 库中查看更多的技术细节。 https://github.com/lhartikk/naivechain

The main component of NaiveChain is
br/> >br/strang> summary
br/>br/> created NaiveChain for demonstration and learning, as it does not have a “poS of PoW” algorithm and cannot be used for public use networks, but it achieves the basic characteristics of block chain operations.
br/> you can see more technical details in the Github library. & nbsp; https://github.com/lhartikk/naivechain



文字格式和图片示例

注册有任何问题请添加 微信:MVIP619 拉你进入群

弹窗与图片大小一致 文章转载注明

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • 以太坊区块链浏览器的搭建

    以太坊区块链浏览器的搭建
    环境;Ubuntu 首先需要下载git 参考链接:?http://www.360bchain.com/article/156.html??Environment; Ubuntu first needs to download git reference link: ˂a rel="noformlow" href="http://www.360bchai.com/article/156.html"? http://www.360bchai.com/article/156.htm...
  • 【CoinCentral 合作內容】加密貨幣 Decred 正式推出 2018 發展路段線圖

    【CoinCentral 合作內容】加密貨幣 Decred 正式推出 2018 發展路段線圖
    早些時候,加密貨幣Decred發表了一篇博客文章,概述了他們2018年的正式發展路線圖。Earlier, encrypt currency Decred published a blog article outlining their official road map for development in 2018.在這個路線圖中,團隊在為他們制定營銷宣傳之前,明確地表明他們於建立和發布可交付物品的成果,同時將他們的營銷集中在項目的核心組成部分。Decred團隊正在研究一些...
  • 百度元宇宙希壤app官方下载

    百度元宇宙希壤app官方下载
    希壤元宇宙是一款非常好玩的休闲手游,这款游戏采用了元宇宙的游戏概念,超级自由的游戏玩法,在这里没有什么标准限定,你可以自由的在这里进行着一切你想做的事情,游戏比较的休闲和放松,没有什么操作难度,感兴趣的小伙伴们可以来007游戏网下载这款非常有趣的希壤元宇宙吧!˂a href=http://m.yx007.com/key/xxsy" target="_blank" , a game that uses the concept of meta-cosm, super-free p...
  • 跨接在两个网络间的语音记录仪设计

    跨接在两个网络间的语音记录仪设计
      摘  要: 设计了语音记录仪。该语音记录仪桥接在通信设备之间,同时提供3种桥接接口:以太网接口,支持在IP通信方式下的各通话组的直通及录音功能;二线接口,支持模拟二线方式下的直通及录音功能;音频接口,支持模拟音频方式下的直通及录音功能。同时话音记录仪提供FTP服务器,可以通过局域网对语音记录仪保存的语音文件进行下载和管理。此外,该设备支持语音回放功能。 extracts & nbsp; to : The voice record...
  • 元宇宙概念股有哪些 元宇宙概念股一览表

    元宇宙概念股有哪些 元宇宙概念股一览表
    元宇宙概念股排行精选 元宇宙概念股一览表(2022/11/08),下文就随小蔡来简单的了解一下吧。The contours of the meta-cosmology unit are in the list of the meta-cosmological concept units (2022/11/08), so let's get to the bottom of this with Little Choi. 元宇宙概念股龙头有:The contou...
标签列表