其他分享
首页 > 其他分享> > 私有区块链 blockchain_go 学习笔记

私有区块链 blockchain_go 学习笔记

作者:互联网

学习源码地址

https://github.com/Jeiwan/blockchain_go.git

原作者讲解的博客

  1. Basic Prototype
  2. Proof-of-Work
  3. Persistence and CLI
  4. Transactions 1
  5. Addresses
  6. Transactions 2
  7. Network

以下是上述内容的学习笔记

项目级开源的区块链推荐

1.以太坊(英文Ethereum)是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币以太币(Ether,简称“ETH”)提供去中心化的以太虚拟机(Ethereum Virtual Machine)来处理点对点合约。
截至2018年2月,以太币是市值第二高的加密货币,仅次于比特币。
https://github.com/ethereum/go-ethereum.git
2.金融领域的区块链项目 Chain
Chain Core是设计用于操作和连接符合Chain协议的高度可扩展许可区块链网络的软件。每个网络都维护一个加密安全的交易日志,称为区块链,它允许参与者在多资产共享账本上定义、发行和转移数字资产。数字资产共享一种通用的、可互操作的格式,可以表示受信任发行人担保的任何价值单位,如货币、债券、证券、借据或忠诚点数。每个链核心持有一份分类账的副本,并独立验证每个更新或“块”,而块签名者的联盟确保分类账的全局一致性。
https://github.com/chain/chain.git
3.基于区块链的开源 分布式账本
https://github.com/hyperledger/fabric.git

比特币和区块链

比特币采用区块链做为底层技术,是新一代加密数字货币,比特币由计算(挖矿)产生,交易过程具有安全性,隐私性,可追溯性,不可篡改性。

区块链是一个公开的分布式数据库,只有在数据库的其他管理员同意的情况下才能添加新记录,是加密货币和智能合约的基础。具备分布式存储,分布式记录,去中心化,分布式维护等特性。

区块链1.0:可编程货币,数字化货币及支付系统。
区块链2.0:可编程金融,股票,清算,私募,股权等金融领域。
区块链3.0:公证,仲裁,审计,物流,医疗等领域。

核心技术

密码学和数字签名用于身份地址标识
共识算法,用于工作量证明
分布式存储技术用于存储交易记录和区块,分布式网络技术用于网络通讯和节点发现。

工作量证明

工作的结果作为数据加入区块链成为一个区块
完成这个工作的人也会获得奖励(也就是通过挖矿获得比特币)

Bolt

纯粹的go语言开发的key和value存储机制,是基于文件的存储。
BoltDB 的一件重要事情是没有数据类型:键和值都是字节数组
1.它简单而简约。
2.它在 Go 中实现。
3.它不需要运行服务器。
4.它允许构建我们想要的数据结构。

地址及身份标识

某种途径可以识别出你是交易输出的所有者,称之为身份。
在比特币中,你的身份就是一对,或者多对公钥和私钥。

公钥算法和数字签名

公钥加密算法使用的是成对的密钥:公钥和私钥。
公钥并不是敏感信息,可以告诉其他人,但是私钥绝对不能告诉其他人,只有所有者才能知道私钥,能够识别鉴定和证明所有者身份的就是私钥。

钱包

钱包就是公钥和私钥的集合

SHA-256哈希

哈希的计算方式是区块链非常重要的特性,正是这个特性使区块链变得安全。

区块

在比特币规范Timestamp中PrevBlockHash, 和Hash是块头,它们形成一个单独的数据结构,而交易(Data在我们的例子中)是一个单独的数据结构。所以为了简单起见,我们在这里混合它们。

区块链

通过哈希获取块

交易

在获得添加块的权限之前必须执行一些繁重的计算(这种机制称为工作量证明)。此外,区块链是一个分布式数据库,没有单一的决策者。因此,新区块必须得到网络其他参与者的确认和批准(这种机制称为共识)。

工作量证明 PoW

一种工作计算很难,验算很容易,在比特币中,此类工作的目标是为块找到满足某些要求的哈希。正是这个哈希值作为证明。

存储数据类型

我们将为此使用encoding/gob,但也可以使用JSON、XML、Protocol Buffers等。

查找区块

将从上到下、从最新到最旧的顺序获取块。一个区块链可以有多个分支,其中最长的被认为是主要的。

交易 输出

关于输出的一件重要的事情是它们是不可分割的,这意味着你不能引用它的一部分值。当一个输出在一个新的事务中被引用时,它被作为一个整体来使用。如果其值大于要求,则会生成更改并将其发送回发送者。这类似于现实世界的情况,例如,您支付 5 美元的钞票以换取价值 1 美元的东西并获得 4 美元的找零。

区块奖励

subsidy是奖励的金额。在比特币中,这个数字不存储在任何地方,仅根据区块总数计算:区块数除以210000. 挖掘创世块产生 50 BTC,每个210000块奖励减半。

Merkle 树(工作量证明)

比特币使用了一种更精细的技术:它将块中包含的所有交易表示为Merkle 树,并在工作量证明系统中使用树的根哈希。这种方法允许快速检查一个块是否包含某些交易,仅具有根哈希并且无需下载所有交易。

查询余额

由于交易存储在区块中,我们必须检查区块链中的每个区块,账户余额是账户地址锁定的所有未使用交易输出的价值总和。

转账

发送硬币意味着创建交易并通过挖掘区块将其添加到区块链中。但比特币不会立即这样做(就像我们所做的那样)。相反,它将所有新交易放入内存池(或内存池)中,当矿工准备好挖一个区块时,它会从内存池中取出所有交易并创建一个候选区块。只有当包含交易的区块被挖掘并添加到区块链时,交易才会得到确认。

比特币地址

比特币地址是公开的。如果你想向某人发送硬币,你需要知道他们的地址。

数字签名

数字签名使用私钥进行,验证需要公钥。比特币中的每笔交易输入都由创建交易的人签名。比特币中的每笔交易都必须在被放入区块之前进行验证。验证方式(除其他程序外):
1.检查输入是否有权使用先前交易的输出。
2.检查交易签名是否正确。

交易事务

当一个人发送硬币时,就会创建一笔交易。交易的输入将参考先前交易的输出。每个输入都将存储一个公钥(未散列)和整个交易的签名。
接收交易的比特币网络中的其他节点将对其进行验证。除其他事项外,他们还将检查: 输入中公钥的散列与引用输出的散列匹配(这确保发送者只花费属于他们的硬币);签名是正确的(这可以确保交易是由硬币的真正所有者创建的)。
签署交易,因为这是比特币中唯一保证一个人不能花费属于其他人的硬币的方法。

Base58

比特币使用 Base58 算法将公钥转换为人类可读的格式,该算法与著名的 Base64 非常相似,但它使用较短的字母表:从字母表中删除了一些字母,以避免一些使用字母相似性的攻击。因此,没有这些符号:0(零)、O(大写 o)、I(大写 i)、l(小写 L),因为它们看起来很相似。此外,没有 + 和 / 符号。

UTXO

由于交易存储在块中,因此它会遍历区块链中的每个块并检查其中的每笔交易。截至 2017 年 9 月 18 日,比特币中有 485,860 个区块,整个数据库占用 140+ Gb 的磁盘空间。这意味着必须运行一个完整的节点来验证交易。此外,验证交易将需要迭代许多块。UTXO 集不存储所有交易,而只存储那些具有未使用输出的交易。
该问题的解决方案是有一个只存储未使用输出的索引,这就是 UTXO 集所做的:这是一个由所有区块链事务构建的缓存(通过迭代块,是的,但这只完成一次),然后用于计算余额和验证新交易。截至 2017 年 9 月,UTXO 集约为 2.7 Gb。

UTXO更新

当一个新的区块被挖出时,UTXO 集应该被更新。更新意味着从新挖掘的交易中删除已使用的输出并添加未使用的输出。如果一个输出被删除的交易不再包含输出,它也会被删除。非常简单!

Merkle 树

如上所述,完整的比特币数据库(即区块链)占用超过 140 Gb 的磁盘空间。由于比特币的去中心化特性,网络中的每个节点都必须是独立且自给自足的,即每个节点都必须存储区块链的完整副本。随着许多人开始使用比特币,这条规则变得更加难以遵循:不可能每个人都会运行一个完整的节点。此外,由于节点是网络的成熟参与者,他们有责任:他们必须验证交易和区块。此外,与其他节点交互和下载新块需要一定的互联网流量。

简化支付验证

SPV 是一个轻量级的比特币节点,它不下载整个区块链,也不验证区块和交易。相反,它在块中查找交易(以验证付款)并链接到完整节点以仅检索必要的数据。这种机制允许多个轻钱包节点只运行一个完整节点。
SPV 中应该有一种方法可以在不下载整个块的情况下检查一个块是否包含某个交易。
Merkle 树的好处是节点可以在不下载整个块的情况下验证某个交易的成员资格。为此,只需要一个交易哈希、一个 Merkle 树根哈希和一个 Merkle 路径。

P2PKH

用于锁定交易输出;交易输入提供数据来解锁输出。
支付公钥哈希(P2PKH),这是比特币中最常用的脚本。从字面上看,它支付给公钥哈希,即用某个公钥锁定硬币。这是比特币支付的核心:没有账户,它们之间没有资金转移;只有一个脚本可以检查提供的签名和公钥是否正确。

区块链网络

区块链网络是一个 P2P(Peer-to-Peer)网络,这意味着节点之间是直接相互连接的。

节点角色

尽管功能成熟,区块链节点可以在网络中扮演不同的角色。他们来了:
1.矿工。
此类节点运行在功能强大或专用的硬件(如 ASIC)上,它们的唯一目标是尽可能快地挖掘新块。矿工只有在使用工作量证明的区块链中才有可能,因为挖矿实际上意味着解决 PoW 难题。例如,在 Proof-of-Stake 区块链中,没有挖矿。
2.全节点。
这些节点验证矿工开采的区块并验证交易。为此,他们必须拥有区块链的完整副本。此外,此类节点执行此类路由操作,例如帮助其他节点发现彼此。
拥有许多完整节点对网络来说非常重要,因为正是这些节点做出决定:它们决定一个区块或交易是否有效。
3.特殊目的公司。
SPV 代表简化支付验证。这些节点不存储区块链的完整副本,但它们仍然能够验证交易(不是全部,而是一个子集,例如,那些发送到特定地址的交易)。一个 SPV 节点依赖于一个全节点来获取数据,并且可能有许多 SPV 节点连接到一个全节点。SPV 使钱包应用成为可能:不需要下载完整的区块链,但仍然可以验证他们的交易。

DNS 服务器

在比特币核心中,有硬编码的DNS 种子。这些不是节点,而是知道某些节点地址的 DNS 服务器。当您启动一个干净的比特币核心时,它会连接到其中一个种子并获取完整节点列表,然后从中下载区块链。

实施

在我们的实施中,虽然会有中心化。我们将有三个节点:
1.中心节点。这是所有其他节点将连接到的节点,也是将在其他节点之间发送数据的节点。
2.一个矿工节点。该节点将新交易存储在内存池中,当交易足够多时,它将挖掘一个新块。
3.一个钱包节点。该节点将用于在钱包之间发送硬币。不过,与 SPV 节点不同的是,它将存储区块链的完整副本。

情景

本文的目标是实现以下场景:
中央节点创建一个区块链。
其他(钱包)节点连接到它并下载区块链。
另外一个(矿工)节点连接到中央节点并下载区块链。
钱包节点创建交易。
矿工节点接收交易并将其保存在其内存池中。
当内存池中有足够的事务时,矿工开始挖掘一个新块。
当一个新块被挖掘出来时,它被发送到中心节点。
钱包节点与中心节点同步。
钱包节点的用户检查他们的支付是否成功。
这就是它在比特币中的样子。尽管我们不打算建立一个真正的 P2P 网络,但我们将实现一个真正的、主要和最重要的比特币用例。

version

节点通过消息进行通信。当一个新节点运行时,它会从 DNS 种子中获取多个节点,并向它们发送version消息,
version用于寻找更长的区块链。当节点接收到version消息时,它会检查节点的区块链是否比 的值长BestHeight。如果不是,节点将请求并下载丢失的块。

中心节点

检查当前节点是否为中心节点。在我们的实现中,中心节点不会挖掘区块。相反,它将新交易转发到网络中的其他节点。

标签:公钥,比特,验证,blockchain,节点,go,区块,交易
来源: https://www.cnblogs.com/SYF8848/p/16266412.html