用Rust实现区块链 - 1 区块和区块链

这篇具有很好参考价值的文章主要介绍了用Rust实现区块链 - 1 区块和区块链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

区块链从技术角度上看就是一个去中心化的,点对点的,保证最终一致性的分布式数据库。下面我们先来实现区块及区块链。

区块

区块存储了区块链中的有效信息,如交易等。这一部分我们先实现简单的区块及区块链,把框架搭建起来,后面随着新功能的加入,再逐渐去完善。

区块头

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct BlockHeader {
    timestamp: i64,
    prev_hash: String,
    nonce: usize,
}
  • timestamp:时间戳

  • prev_hash:前一个区块的Hash值

  • nonce:随机数,用于计算工作量证明

区块

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct Block {
    header: BlockHeader,
    data: String,
    hash: String,
}
  • header:区块头

  • data:区块存储的数据,后面在实现交易的功能时,这个字段会修改为交易集合。

  • hash:块的Hash值

每个区块都计算存储了一个hash值,区块头中存储了前一个区块的hash,这样就形成了一个区块链。如图:

用Rust实现区块链 - 1 区块和区块链

计算hash值

我们对区块头进行hash就可以了,因为区块头包含了区块的所有信息,后面会把交易的hash值也加入到区块头中。

先使用serde和bincode库把区块头序列化成字节,然后再使用SHA256计算hash值。

pub fn serialize<T>(data: &T) -> Result<Vec<u8>, BlockchainError> 
where
    T: Serialize + ?Sized
{
    Ok(bincode::serialize(data)?)
}

pub fn hash_to_str(data: &[u8]) -> String {
    let mut hasher = Sha3::sha3_256();
    hasher.input(data);
    hasher.result_str()
}

 

新建区块及实现创世块

创世块是区块链中的第一个区块,所以区块头中的prev_hash没有值。

pub fn new(data: &str, prev_hash: &str) -> Self {
    let mut block = Block {
        header: BlockHeader { 
            timestamp: Utc::now().timestamp(), 
            prev_hash: prev_hash.into(), 
            nonce: 0, 
        },
        data: data.into(),
        hash: String::new(),
    };
    block.set_hash();

    block
}

pub fn create_genesis_block() -> Self {
    Self::new("创世区块", "")
}

区块链

我们现在先把区块存储在内存中,后面部分会把区块存储到KV数据库中。

pub struct Blockchain {
    blocks: Vec<Block>,
    height: usize,
}
  • blocks:区块集合

  • height:区块链的高度,即区块个数。

挖矿

就是将区块加入到链中

pub fn mine_block(&mut self, data: &str) {
    let prev_block = self.blocks.last().unwrap();
    let block = Block::new(data, prev_block.get_hash().as_str());
    self.blocks.push(block);
    self.height += 1;
}

创建区块链及加入区块

let mut bc = Blockchain::new();

bc.mine_block("Justin -> Bob 2 btc");
bc.mine_block("Justin -> Bruce 2 btc");

bc.blocks_info();

执行结果:

$ RUST_LOG=info cargo run --example gen_bc --quiet

INFO blockchain_rust_part_1::blocks::blockchain: Block {
    header: BlockHeader {
        timestamp: 1650188197,
        prev_hash: "",
        nonce: 0,
    },
    data: "创世区块",
    hash: "dc7e47a45b9b898269efbc4e05cff5d2c8c9dac17cd181451471e62cdcd646c6",
}
INFO blockchain_rust_part_1::blocks::blockchain: Block {
    header: BlockHeader {
        timestamp: 1650188197,
        prev_hash: "dc7e47a45b9b898269efbc4e05cff5d2c8c9dac17cd181451471e62cdcd646c6",
        nonce: 0,
    },
    data: "Justin -> Bob 2 btc",
    hash: "8620a3e7965c71ccf391898bb53a374db8d133a2c7dcbfa05cea9b83a06c04dc",
}
INFO blockchain_rust_part_1::blocks::blockchain: Block {
    header: BlockHeader {
        timestamp: 1650188197,
        prev_hash: "8620a3e7965c71ccf391898bb53a374db8d133a2c7dcbfa05cea9b83a06c04dc",
        nonce: 0,
    },
    data: "Justin -> Bruce 2 btc",
    hash: "3618c57b1aec52b56f820bc20a03f171174a059c5a982e486e0975c1eccbaa12",
}

工程结构

用Rust实现区块链 - 1 区块和区块链

完整代码:

https://github.com/Justin02180218/blockchain_rust


更多文章,请关注公众号:coding到灯火阑珊

用Rust实现区块链 - 1 区块和区块链文章来源地址https://www.toymoban.com/news/detail-469835.html

到了这里,关于用Rust实现区块链 - 1 区块和区块链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 了解区块链---一个去中心化技术

    1.假如你是从事区块链的高端技术人员,我从来没有接触过区块链,请你为我讲解下他的概率、原理、应用? 概念: 区块链是一种 去中心化 的 分布式账本技术 ,它是由一系列 区块 组成的 链式结构 ,每个 区块包含一些交易数据 ,并且通过 密码学算法 与之前的区块链接在

    2024年02月16日
    浏览(59)
  • 用Rust实现区块链 - 6 点对点网络(P2P)

    截止到目前,我们在单机上实现了区块链的几乎所有关键特性:随机生成的地址、安全、持久化、工作量证明、UTXO交易。接下来我们将使用rust-libp2p库来实现区块链的p2p网络。 P2P 网络拓扑结构有很多种,有些是中心化拓扑,有些是半中心化拓扑,有些是全分布式拓扑结构。

    2024年01月17日
    浏览(50)
  • 【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

    ExceptionHandler是Spring框架提供的一个注解,用于处理应用程序中的异常。当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。该注解可用于类级别和方法级别,以捕获不同级别的异常。 在Spring中使用ExceptionHandler非常简单,只需在需

    2023年04月09日
    浏览(45)
  • 【Rust日报】用Rust从头实现一个C编译器

    一个声明式解析库 Untwine 发布0.4 Untwine是一个声明性解析库,它允许一种类似于使用自定义宏语法进行直接模式匹配的解析风格。这允许创建具有良好性能特征和高质量错误消息的极其紧凑的解析器。这些解析器实现起来很简单,有几个精心挑选的例子: 一个几乎完整的JSO

    2024年04月22日
    浏览(42)
  • 这就是区块链开源底层软件平台——长安链ChainMaker

    本文已参与「开源摘星计划」,欢迎正在阅读的你加入。 活动链接:https://github.com/weopenprojects/WeOpen-Star 一、介绍一下长安链 它是国内首个自主可控区块链软硬件一体技术体系,拥有自主可控的底层平台、完整便捷的配套工具、标准化下的开放生态、灵活高效的装配模式以及

    2023年04月08日
    浏览(34)
  • 亚太地区是Aleo下一个重点市场!ZK技术将重塑区块链世界!

    4 年,3 亿美元,基于 ZK 的隐私公链,是 Aleo 最直观的三个标签。区块链的致富效应,已经让传统金融蠢蠢欲动,想参与Aleo私募和头矿的朋友请于文末添加微信。 对于Aleo副总裁兼业务发展主管Joanna Zeng来说,近期专访中频繁出现的是\\\"Technology\\\"。以下是整理的专访实录,

    2024年02月03日
    浏览(42)
  • 如何用rust实现一个异步channel

    使用通信来共享内存,而不是通过共享内存来通信 上面这句话,是每个go开发者在 处理多线程通信时 的座右铭,go甚至把实现这个理念的channel直接焊在编译器里,几乎所有的go程序里都有channel的身影。 rust的异步和go的goroutine有异曲同工之妙,甚至可以把 tokio::spawn 理解为g

    2024年02月11日
    浏览(74)
  • rust里如何快速实现一个LRU 本地缓存?

    LRU是Least Recently Used(最近最少使用)的缩写,是一种常见的缓存淘汰算法。LRU算法的基本思想是,当缓存空间已满时,优先淘汰最近最少使用的数据,以保留最常用的数据。 在计算机系统中,LRU算法常用于缓存系统、页面置换算法等场景,以提高数据访问的效率和性能。 要

    2024年02月13日
    浏览(43)
  • Java实现一个简单的区块链

    区块链技术是近年来非常热门的话题,它在加密货币、供应链管理、智能合约等领域有着广泛的应用。本文将通过一个具体的Java代码案例,展示如何实现一个简单的区块链。我们将首先展示代码案例,然后逐步解析其中的关键技术和知识点,以便读者能够更好地理解和应用这

    2024年03月22日
    浏览(51)
  • 用Java代码实现区块链技术

    比特币很热门——这是多么轻描淡写的说法啊。虽然加密货币的未来有些不确定,但用于驱动比特币的区块链技术也非常流行。 区块链的应用范围几乎无穷无尽。可以说,它还有可能破坏企业自动化。关于区块链是如何运作的,有很多信息。我们有一份免费白皮书,介绍区块

    2024年01月15日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包