区块链基础知识及在以太坊网络上构建私链(单节点)
imToken 是一款全球领先的区块链数字资产管理工具[ZB],帮助你安全管理BTC, ETH, ATOM, EOS, TRX, CKB, BCH, LTC, DOT, KSM, FIL, XTZ 资产,同时支持去中心化币币兑换功能 ...
系列文章预览:区块链陷阱基本扫盲及搭建以太坊网络私链(单节点)系列文章2:区块链陷阱:搭建以太坊网络私链(多节点)及创建多重签名钱包系列文章3:区块链陷阱:智能合约Token编写简介及使用
区块链近几年如火如荼,呈现出越来越被看好的趋势。相信不少朋友都踩过坑,也有很多朋友只是听说过概念,却没有真正接触过,更谈不上开发应用。这里我们还是普及一下区块链的基本概念(已经了解概念和原理的可以直接跳到环境部分):
什么是区块链?
区块链是一种新型的去中心化协议,可以安全地存储比特币交易或其他数据。信息不可伪造或篡改,可以自动执行智能合约,无需任何中心化机构的审核。交易可以是比特币等数字货币,也可以是债务、股权、版权等数字资产。区块链技术解决了拜占庭将军问题,大大降低了实体经济的信任成本和记账成本,重新定义了互联网时代的产权体系。
更加具体详细的描述,可以参考下面这段话:
区块链()是一个由节点参与的分布式数据库系统,其特点是不可篡改、不可伪造,也可以理解为账本系统()。是比特币的重要概念以太坊和比特币区块链钱包,完整的比特币区块链的副本记录了其代币的每一笔交易,通过这些信息,我们可以找到历史上任意一个时间点每个地址的价值。
区块链是由一系列使用密码学方法生成的数据块组成,每个块都包含前一个块的哈希值,从创世块连接到当前块,形成区块链。每个块都保证按时间顺序在前一个块之后生成,否则前一个块的哈希值是未知的。这些特性使得比特币的双花(-)非常困难。区块链是比特币的核心创新。
区块链的概念最早是在中本聪的比特币白皮书中提出的,不过是以工作量证明链的形式。以下是中本聪对区块链概念的描述:
时间戳服务器通过对以区块形式存在的一组数据进行随机哈希处理来添加时间戳,并广播该随机哈希,就像在新闻中发布信息或世界新闻集团网络()。显然,时间戳可以证明特定数据在特定时间一定存在过,因为只有当它在那一刻存在时,才能获得相应的随机哈希值。每个时间戳都应该在其随机哈希值中包含前一个时间戳,而每个后续时间戳都会增强前一个时间戳(),从而形成一个链条。
节点始终将最长的链视为正确的链,并继续工作和扩展它。如果两个节点同时广播新区块的不同版本,则其他节点收到区块的时间会有所不同。在这种情况下,他们将在他们首先收到的区块上工作,但也会保留另一条链,以防后者成为最长链。直到找到下一个工作量证明并确认其中一条链是较长的链时,平局才会被打破,然后,在另一条分支链上工作的节点将切换阵营并开始在较长的链上工作。
比特币钱包的功能依赖于区块链的确认,一次有效的验证称为一次确认,通常一笔交易需要多次确认后才能进行。轻量级(SPV)比特币钱包,其客户端只需要在本地保存用户一次性交易相关的数据,并不存储完整的区块链。
区块链技术是很多加密数字货币的核心imToken官网,包括比特币、以太坊、莱特币、狗狗币等。区块链的维护方式有工作量证明、权益证明等。
区块链的优势
区块链架构的核心优势包括:
1、任何节点都可以创建交易,经过一段时间的确认,可以合理地确认交易是否有效,区块链可以有效防止双花问题的发生。
2. 试图重写或者修改交易记录的成本非常高。
3. 区块链实现了两种类型的记录:交易()和区块()。交易是存储在区块链上的实际数据,而区块是确认某些交易何时以及以何种顺序成为区块链数据库一部分的记录。交易是由正常使用系统的参与者创建的(在加密货币的情况下,交易是由 Bob 向 Alice 发送代币创建的),而区块是由我们称为矿工的单位创建的()。
区块链的工作原理
那么问题来了,我们在讲区块链,那么什么是区块呢?
数据通过称为区块的文件永久记录在加密货币网络上。它们就像股票交易账本。新区块被添加到记录(区块链)的末尾,一旦写入,就很难修改或删除。
区块的结构是怎样的?
什么是区块头?
区块头由三组区块元数据组成,第一组是引用父区块哈希值的一组数据,这组元数据用于将区块与区块链中的前一个区块联系起来。第二组元数据,即难度、时间戳和随机数,与挖矿竞争有关。第三组元数据是树的根(用于高效汇总区块中所有交易的数据结构)。
区块头结构是怎样的?
创世区块是什么?
比特币区块链的第一个区块诞生于2009年,我们称之为创世区块,它是比特币区块链中所有区块的共同祖先,也就是说从任意一个区块往前追溯,最终都会到达创世区块。
每个节点都“知道”创世区块中的哈希值、结构、创建时间和一笔交易,因此每个节点都以这个区块作为区块链的第一个区块,从而构建一个安全可信的区块链根。
在.cpp文件中,你可以看到创世区块被编译到了比特币核心客户端中。
创世区块的哈希值为:
从命令行使用 Core 客户端:
$ {“hash”:“”,“”,“size”:285,“”:“0”,“”:“1”,“”:“a33b”,“tx”:[“a33b”],“time”:“nonce”:“bits”:“”,“”:1.,“”:“”}
创世区块中隐藏着一条信息,交易输入中包含这样一句话:“泰晤士报 03/Jan/2009 濒临崩溃”。这句话是当天泰晤士报头版文章的标题。引用这句话,不仅解释了区块生成的时间,也算是半开玩笑地提醒人们独立货币体系的重要性,同时告诉人们,随着比特币的发展,一场史无前例的全球货币革命即将发生。这条信息,是比特币创始人中本聪在创世区块中嵌入的。
什么是区块链分叉?
诚实的矿工只会在最长的有效链上创建最新的区块。“长度”()是指区块链的累计计算难度,而不是区块数量。当链中包含的所有区块和交易都是有效的,并且链从创世区块开始时,它就被认定为有效的区块链。
对于区块链中的任何区块,只有一条路径通往创世区块。但是,从创世区块开始,就会出现分叉。当两个区块的创建时间相差只有几秒钟时,通常会产生分叉区块。当发生这种情况时,节点会在它们首先收到的区块之上创建区块。下一个区块中包含的任何区块都将成为主链的一部分,因为它更长。
短链(无效链)中的区块没有任何作用。当比特币客户端切换到另一条更长的区块链时,短链中的所有有效交易区块都会重新添加到顺序交易池中,并将包含在下一个区块中。短链中的区块奖励不会出现在最长的区块链中,因此它们实际上已经丢失,这就是为什么网络强制要求 100 个区块成熟时间才能使生成存在的原因。
短链中的区块通常被称为“孤儿区块”()。这是因为长链中的生成交易没有父区块,因为这些生成交易在交易 PRC 列表中显示为孤儿区块。一些矿池误解了这些信息,并声称他们的区块是“孤儿区块”。事实上,这些区块有父区块,甚至可能有子区块。
区块链衍生的几个概念
公有链()
公有链是指世界上任何人都可以读取、发送并有效确认的共识区块链。公有链的安全性由工作量证明(POW)或权益证明(POS)机制维护。它们以经济奖励和加密数字验证相结合的形式存在,并遵循每个人可获得的经济奖励与其对共识过程的贡献成正比的一般原则。这些区块链通常被认为是“完全去中心化的”。
社区区块链: ( )
社区区块链是一种共识过程由预先选定的节点控制的区块链;例如,有 15 家金融机构组成一个社区,每个机构运行一个节点,并且为了使每个区块有效,需要由其中 10 个节点确认。区块链可能允许所有人读取,也可能仅限于参与者,或者它可能采取混合路线,例如区块的根哈希及其 API(应用程序编程接口)是公开的,这允许外界进行有限数量的查询并获取有关区块链状态的信息。这些区块链可以被视为“部分去中心化”。
私有链( ),又称无代币区块链
完全私有的区块链是指写入权限仅限于单个组织的区块链。读取权限要么向公众开放,要么被任意限制。应用包括数据库管理、审计,甚至一家公司,但在许多情况下,公共可读性并不是必要的。
公有链与私链的特点
社区区块链融合了公有链的“低信任”和私有链的“单一高信任”,提供了一种混合模型,而私有链可以更准确地描述为具有一定数字加密性和可管理性的传统中心化系统。
环境
① 下载以太坊钱包 Mist 或
以下是我使用的两个版本:
Mist 链接:密码:dt9j
链接: 密码: nhsu
Geth 链接:密码:5zq1
②这里我们以Mist为例,下载后解压Mist并直接运行,此时会在C盘生成一个Mist Geth目录,同步过程非常慢,测试环境可以直接跳过。
C:\用户\\\\Mist\\Geth\
我们首先将生成的目录添加到系统Path环境变量中,方便我们后续的操作。
添加完Path之后我们打开命令窗口,执行:geth -h查看geth版本和其他命令信息如下图:
此时需要注意在C盘目录下还生成了一个以太坊目录:C:\Users\\\\
该路径存储了账户密钥信息,块文件等信息。
geth new 创建新账户命令
密钥一般存放在:C:\Users\\\\\ 如下图:
构建以太坊私链
写入创世块.json文件内容如下:
{ "nonce": "0x0000000000000042", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x00", "gasLimit": "0x8000000", "difficulty": "0x400", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": { }, "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 } }