主页 > 以太坊imtoken > 掌握比特币

掌握比特币

以太坊imtoken 2023-02-10 07:48:16

掌握比特币 一、简介

软件工程、密码学和经济学的结合。

需要解决数字货币的两个基本问题:

比特币构成:

比特币客户端:

全客户端:全客户端,或称“全节点”,存储所有比特币交易的完整交易历史(每个用户进行的每一笔交易,曾经拥有的每一笔交易)端,可以管理钱包,可以直接在比特币上开始交易网络。

轻量级客户端:存放用户的钱包,但需要依赖第三方服务器进行比特币交易和访问比特币网络。 不会保留所有交易的完整副本。

在线客户端:通过网络浏览器访问并存储用户在第三方服务器上的钱包

不同客户端的选择:完整的客户端管理钱包本身,钱包备份和安全的责任转移给用户。 其他人则需要考虑第三方的风险。

2、基本工作原理

运营的一个关键点:信任,不仅仅是一个人信任另一个人,而是这个领域的所有参与者都给予认可。 **如何? **区块链技术,一个公开的交易账本,这个账本是所有人都可以看到和复制的,但是里面的信息是不能修改的,只能在之前的信息的基础上添加新的信息作为修正。 **如何让区块链上的信息无法修改? **这个“不可能”是相对的。 一个区块与一个区块相连,下一个区块存储前一个区块的哈希值。 如果其中一个区块被修改,就会发生连锁反应。 下一个区块的信息也需要修改,下一个区块也需要更改。 这样修改成本会很高,所以没有人去做。

**那么谁来计算区块的哈希值呢? **没有中心化服务器,**谁来提供这样的服务? **这就造就了矿工,矿工提供算力计算区块,记录链上的交易,那么如何推动矿工的工作呢? 一种激励方式出现了,最简单也是最暴力的方式,就是为了钱而工作。 矿工成功向交易链提供算力后,将获得收益分成。 至于这个收益如何计算,最终由谁来获得这个收益,我们会在后面详细讨论。

在这种推动下,系统初步建成。 **那么交易的结构是怎样的呢? 即如何让数据有价值? **这绝对不是数据本身的价值,而是数据记录的内容。 这里有个概念,**utxo----unspent transaction output,**unspent transaction output,意思是链上的交易记录,用这些交易记录代表你自己的财产。 记录的基本信息包括输入和输出。 输入是本账户的支出,输出是本账户或其他账户(包括挖矿)的收入。 你有多少财富的记录是,一个账户给你输入了币,你可以消耗币形成新的记录。 标记你的账户,名词是address,也就是钱包地址一个密钥有多少比特币,可以公开,大家转账的地址就是填这个地址。 这个地址通过私钥椭圆加密算法(单向)得到公钥,公钥通过双哈希算法(单向)得到地址,所以最重要的是私钥,其安全性是通过两种加密算法实现维护,万一哪天这个加密算法被破解了,那就gg了。

3.客户端的使用

比特币客户端的编写与使用。

4.密钥、地址、钱包、生成及使用

钱包:数字密钥由用户生成并存储在文件或简单数据库中,不存储在网络中,称为钱包。

用户存储的数字密钥完全独立于比特币协议,可以由用户钱包软件生成和管理,无需区块链或网络连接。

本章将是钥匙所在的地方,即钱包。 了解如何生成、存储和管理密钥。 私钥和公钥、地址和脚本地址的各种编码格式。 密钥的特殊用途:生成签名、证明所有权以及创建比特币虚荣地址和纸钱包。

如何获得安全的私钥?

首先私钥可以取的取值范围是:1-(n-1),n=1.158*10^77。 要生成一个相对安全的私钥,可以随机化一个256位的数,检查它是否小于n。 从编程的角度来看,通常是从加密安全的随机源中获取一长串随机字节。 对于使用sha256 Hash算法运算,可以得到一个256位的数,然后检查是否符合范围。

如何获得公钥?

使用私钥计算椭圆曲线的乘积得到公钥。 我不明白具体情况。 使用 secp256k1 标准。

如何获得比特币地址?

比特币地址通常显示为交易的接收者。 比特币地址可以通过一种单向加密哈希算法从公钥中获得。 哈希算法在比特币中应用广泛:比特币地址、脚本地址、挖矿中的工作量证明算法。 用于从公钥生成比特币地址的哈希算法有:安全哈希算法 (SHA) 和 RACE Integrity Primitives Evaluation Message Digest (RIPEMD),尤其是 SHA256 和 RIPEMD160。

*公钥====》SHA256===》RIPEMD160===》公钥哈希====》Base58check编码(前缀版本位0x00)===》比特币地址(Base58Check编码的公钥哈希)*

比特币怎么比特币钱包_一个密钥有多少比特币_比特币分叉对比特币的影响

你知道base58和Base58Check编码吗

为了更简洁方便地表达一长串数字,使用由数字和可想数组成的大于十进制的表示法。 例如十六进制。 Base64使用26个小写字母、26个大写字母、10个数字和两个符号(如“+”、“/”)。 Base58 是一种基于文本的二进制编码格式,用于比特币和其他加密货币。 这种编码格式既实现了数据压缩,又保持了易读性。 Base58不包括0数字零,O字母大写o,l小写字母L,I大写字母i。

Base58Check 添加了错误检查代码来检查转录中的数据是否有错误。 校验码长度为4字节,加在待编码数据的末尾。

*data ==== "版本前缀+数组Hash(版本+数据)截取前四个字节作为校验码"版本+数据+校验码Base58编码"Base58编码数据*

公钥格式

它可以分为两种形式:未压缩格式或压缩格式。 公钥是由一对坐标 (x, y) 组成的椭圆曲线上的一个点。 未压缩格式:04+x+y 压缩格式:需要判断y的正负,因为压缩后需要携带y的正负信息。 二元运算计算椭圆曲线时,y可以是奇数也可以是偶数,对应于y值的符号。 y 为偶数:02x,y 为奇数:03x

场景:当一个钱包应用导入另一个钱包应用的私钥时,需要扫描区块链,找到与这些导入的私钥相关的所有交易。 那么钱包应该扫描哪个比特币地址呢? (因为公钥有两种格式,压缩格式公钥和非压缩格式公钥,所以得到的比特币地址也不一样)

解决方法:在导出私钥时,添加后缀表示公钥是否可以压缩,添加后缀01表示私钥来自较新的钱包,只能用于生成压缩公钥。 形成规范。

钱包导入格式(WIF,Wallet Import Format):私钥以Base58校验和编码格式显示。

比特币钱包概念

钱包是私钥的容器,通常通过有序文件或简单数据库实现。

另一种生成私钥的方法是:使用原始私钥通过单向哈希函数生成每一个新的私钥,并将新生成的密钥依次连接起来。

不同的私钥生成方式及其钱包结构。

非确定性钱包,也称为零型非确定性钱包。 就是从一开始就生成足够的私钥,并且每个密钥只使用一次。 很难管理、备份和导入,因为您生成了很多文件并且必须保留所有文件的副本。 现在被确定性钱包取代。

确定性钱包包含可以使用单向离散方程从公共种子生成的私钥。 这里的种子是一个随机生成的数字。 该数字还包含生成私钥的索引号或“链代码”。 有了种子,就无需备份每一个私钥,只需要在发生意外时进行简单的备份即可。

助记词表是一系列英文单词,表示(编码)用作确定性钱包对应的种子的随机数。 它是一个使用助记词作为种子的确定性钱包。 它的优点之一是它比随机数字序列更容易被正确读取和转录。

BIP0039定义助记词和种子创建过程如下:

- 1.创建一个128到256位的随机序列(熵);

- 2.提出SHA256哈希的前几位数字,创建一个随机序列的校验和;

- 3.加载随机顺序后面的校验和;

- 4.将顺序分解为不同的11位集合,并使用这些集合对应一个预定义的2048个单词的字典;

- 5.生成12到24个字的助记词。

分层确定性钱包或 HD 钱包定义

HD 钱包提供具有两个主要优点的随机(非确定性)密钥,

从种子创建 HD 钱包

一个密钥有多少比特币_比特币怎么比特币钱包_比特币分叉对比特币的影响

加密安全

伪随机数发生器

||

|| |主私钥 m (256bits)

/ | |

根种子=====》HMAC-SHA512 ====== | 主公钥 M (264bits)

(128、256 或 512 位)(512 位输出)单向哈希函数|

|| |主链码(256bits)

||

/

助记词

在这里插入图片描述

为什么要使用如此多的比特币地址和公钥?

五、交易流程

比特币交易的本质是数据结构,它包含了比特币交易参与者价值转移的信息。

该系统的每一部分都是为了确保比特币交易能够在比特币网络中生成、传播和验证,并最终添加到全球比特币交易账本(比特币区块链)中。

比特币交易本身不包含敏感信息,因此它们可以通过未加密的网络(例如 wifi、蓝牙、NFC、ChirP、条形码,或复制并粘贴到网络表单中)发送到比特币网络。

比特币交易被发送到任何连接到比特币网络的节点,比特币将由节点验证。 如果验证有效,该节点会将其传播到与您连接的其他节点,并返回一条表示交易成功的返回消息。 如果交易被验证为无效,节点将拒绝接受交易,同时向交易发起方返回交易被拒绝的消息。

那么比特币的交易验证引擎依赖于两类脚本来验证比特币交易:

一个是锁定脚本和解锁脚本。 锁定脚本携带公钥; 解锁脚本由用户提供,用于解析锁定脚本的“锁定”。

该脚本是一种基于逆波兰表示法的基于堆栈的执行语言。 它是有意以一种重要的方式设置的——除了复杂的流量控制功能外,没有循环或条件流量控制。 使这种脚本语言图灵不完整。 受限语言可防止交易激活机制被用作弱环境。

交易的基本单位是未使用的交易输出,简称UTXO。

什么是 UTXO?

未花费的交易输出 未花费的交易输出。 它是一定数量的比特币货币,不能再被分割,不能被所有者锁定,也不能记录在区块链中,被全网认可为货币单位。 用户的比特币余额是通过扫描区块链并汇总属于该用户的所有 UTXO 来计算的,这些 UTXO 分散在数百个交易和数百个区块链中。

交易输出包括两部分:

比特币分叉对比特币的影响_一个密钥有多少比特币_比特币怎么比特币钱包

交易产生的手续费,即矿工费。 它基于事务的大小,以千字节为单位。

标准交易

五个标准脚本是 P2PKH、P2PK、MS、P2SH 和 OP_Return。

这类交易脚本的特点:需要输入公钥和对应私钥的数字签名才能解锁一个用公钥哈希实现的锁定脚本。 .

与P2PKH不同的是,在P2PK的加锁脚本中,公钥本身已经存储在加锁脚本中。

多重签名脚本设置了一个条件。 如果脚本中记录的公钥数量为N,则至少需要M个公钥才能解锁。 这被称为 MN 组合。 N为脚本中记录的公钥总数,M为多重签名生效的公钥阈值(最小数量)。

比特币的分发和带时间戳的账户机制(又名区块链)的潜在应用远远超出支付。 充分发挥其交易脚本语言的安全性和可恢复性优势,应用于电子交易服务、证券认证、智能合约协议等领域。 但是他在非支付领域的应用引起了开发者的分歧,因为在非支付领域的使用会导致所有区块链节点以消耗磁盘存储空间为代价来承担存储此类数据的任务。 通过使用 OP_RETURN 运算符来避免 UTXO 集的内存膨胀来实现折衷。

P2SH是为了解决MS多重签名产生的复杂操作,让复杂脚本的使用可以像支付比特币地址一样简单。

6. 网络建设与通信

P2P是指同一个网络中的每一台计算机都是平等的,各个节点共同提供网络服务,没有“特殊”的节点。

尽管网络中的节点彼此平等,但每个节点根据所提供的功能可能会有不同的分工。 每个比特币节点都是路由、区块链数据库、挖矿和钱包服务的集合。

每个节点都会参与整个网络的路由功能,也可以包含其他功能。 每个节点都参与验证和传播交易和区块信息,发现和维护与对等节点的连接。 包含不同功能的节点可分为以下几类:

比特币核心客户端:路由+区块链数据库+挖矿+钱包服务

全节点:拥有完整且最新的区块链副本,无需任何外部参考即可自动记录所有交易。路由+区块链数据库+钱包服务

SPV节点(轻量级节点):通过“简单支付验证SPV”方式完成交易验证。路由+钱包服务

全区块链节点:路由+区块链数据库

独立矿工节点:路由+拥有区块链数据库的完整副本+挖矿

矿池协议服务器:运行其他协议的节点(如矿池挖矿节点、Stratum节点)会连接到P2P网络的网管路由器。 包含 Pool 服务器、Stratum 服务器。

挖矿节点:包括没有区块链但有Straum协议节点或其他矿池挖矿协议节点的挖矿功能。

轻量级 (spv) stratum 钱包:包含一个没有区块链的钱包,一个运行 Straum 协议的网络节点。

节点间通信当与已知对端节点建立连接时,会发送一条带有基本认证内容的版本消息,开始握手通信过程:

新节点如何发现网络中的对等节点?

当一个或多个连接建立后,新节点可以向邻居节点推送一条包含自己IP地址的信息,邻居再将其推送给自己的邻居节点,从而保证新节点信息被多个节点接收,保证连接更稳定,这就是泛洪机制。 新介入的节点也可以向其相邻节点发送申请,拉取相邻节点的已知IP地址列表。

在实际网络中,节点会随机加入和离开,通信路径不可靠。 实用解决方案: 1. 现有连接丢失时发现新节点(如何发现新节点?),帮助其他节点启动。 如果一个节点连接到大量其他对等节点,则会浪费网络资源。 2. 启动完成后,节点会记住它最近连接的对等节点(存储在数据库中?),当它重新启动时,它可以快速重新建立与之前对等网络的连接。 如果之前的网络没有应答,节点可以使用种子节点重启。

连接成功后,首先要做的就是看到完整的区块链。 如果是一个全新的节点,那么他只有一个创世块——静态嵌入在客户端软件中。 两个节点通信时,发送版本时,消息中包含的BestHeight字段表示节点当前的区块链高度(数量),双方有一个基本的相互连接、版本、区块数。 可以发消息让getblock交换他们本地区块链顶层区块链的hash值。 可以根据哈希值在本地的位置来判断谁的块长,需要发送哪些块来补充。 他会用inv(inventory)消息传播区块的hash值,缺少这些区块的节点可以通过自己发送的getdata消息来请求整个区块的信息。

比特币分叉对比特币的影响_比特币怎么比特币钱包_一个密钥有多少比特币

例如,假设一个节点只有创世块。 然后它将收到来自其对等方的 inv 消息,其中包含链中接下来的 500 个块的哈希值。 它将开始向所有连接的对等点请求块,分散负载并确保它不会压倒任何请求的对等点。 该节点跟踪每个对等连接“传输中”的块数,即已请求但尚未收到的块,并检查它是否不超过限制(MAX_BLOCKS_IN_TRANSIT_PER_PEER)。 这样,如果需要大量块,只有在满足先前的请求时才会请求新块,从而允许对等点控制更新速率而不会压倒网络。 当每个块被接收时,它被添加到区块链中。 随着本地区块链的建立,更多的区块被请求和接收一个密钥有多少比特币,这个过程一直持续到节点赶上网络的其余部分。

具有完整区块信息的节点的验证方法是构建一个验证链,由数千个区块和交易沿着区块链按时间倒序追溯到创世块,建立一个完整的UTXO数据库验证有效性通过确认 UTXO 是否未被支付来进行交易。

简单支付验证 (SPV) 节点

spv节点只需要下载区块头,不需要下载每个区块包含的交易信息。 通过检查其上方的块将其推到下方的深度来验证交易。 由于 spv 节点需要读取特定交易以选择性地验证交易,这会产生隐私风险,并且 spv 节点对特定数据的请求可能会无意中泄露钱包中的地址信息。 布隆过滤器用于解决spv节点的隐私风险。 使用概率而非固定模式的过滤机制允许 SPV 节点仅接收交易信息的子集,而不会准确泄漏它们感兴趣的地址。

布隆过滤器是怎么做到的?

Bloom filter 是一种基于概率的过滤方法,它允许用户描述特定的关键字组合,而不必精确地表达它们。 它允许用户有效地搜索关键字,同时保护他们的隐私。 在spv节点中,用于向peer发送交易信息查询请求,交易地址不会暴露。

布隆过滤器具体实现

交易池

几乎每个节点都维护的未确认交易的临时列表。 他是矿工提前准备好的“材料”,为下一个新区块的启动做准备。 当发起交易时,它将在网络上广播并存储在交易池中。 当一个新的区块开始竞争时,将从交易池中取出进行验证,加入区块并广播到网络中,开始求解问题完成工作量证明,交易放入utxo池中这次因为验证通过了,但是交易还没有完成,区块还没有上传到链上,还没有被网络识别。 如果包含该交易的区块完成了工作量证明,则该交易成功完成并从 utxo 池中移除。 如果包含此交易的区块在链上竞争失败,则它仍在 utxo 池中,交易完成。

7. 区块链技术

区块结构:它由一个包含元数据的区块头和一长串交易以及随后的区块体组成。

区块头组成:由三组区块元数据组成。 首先,一组引用父块哈希的数据。 这组元数据用于将这个块连接到区块链中的前一个块。 第二组元数据,难度、时间戳和随机数,与挖矿竞争有关。 第三组元数据是默克尔树根(一种用于有效汇总区块中所有交易的数据结构)。

区块标识符:区块头哈希和区块高度

对区块头进行二次哈希处理得到的数字指纹。

父块的头哈希值存储在子块的块头中,子块的块头哈希值计算为孙子块的块头中的“前一个块头哈希值”。

Merkle树是一种哈希二叉树,作为一种数据结构,用于快速归纳和验证大规模数据的完整性。 此二叉树包含加密哈希值。 在比特币网络中,它被用来汇总一个区块中的所有交易,生成整个交易集的数字指纹,为验证一个交易是否存在于一个区块中提供了一种高效的方式。

Merkle树的生成:需要对哈希节点对进行递归哈希,将新生成的哈希节点插入到Merkle树中,直到只剩下一个哈希节点,即Merkle树的根。

在这里插入图片描述

在这里插入图片描述

需要证明区块中是否存在交易k ===》证明Merkle树中是否存在Hk(交易k的双哈希值)==需要从下到上的Merkle路径=》计算四个哈希值用于鉴权比对。

如何获得默克尔路径?

Merkle 树和简单支付验证 (SPV) 的结合。 spv节点想知道自己钱包中的某个比特币地址即将到达支付,节点会在节点间的通信链路上建立布隆过滤器,限制只接受包含目标比特币地址的交易。 当节点检测到交易与布隆过滤器匹配时,它会将块作为 Merkle 块消息发送。 Merkle 块消息包含块头和将目标交易链接到 Merkle 根的 Merkle 路径。 spv节点可以通过这条路径找到与交易相关的区块,然后验证相应区块中交易的存在。

8. 共识与激励推广、挖矿

挖矿:基于哈希算法,通过计算完成一道数学题。 这些学习难题的答案包含在新区块中,作为矿工计算工作量的证明,称为工作量证明。

奖励:有两种类型,创建新区块的奖励和完成计算难题的交易通行费。

比特币怎么比特币钱包_比特币分叉对比特币的影响_一个密钥有多少比特币

挖矿(共识和激励促进)===》支持比特币安全的去中心化

每个节点在验证每笔交易时都需要检查一长串标准。 如果无效,它将在第一个节点被丢弃,否则将在网络中传播。 如果节点收到大量交易,还没有来得及对其进行全面验证,则会在收到时按照相应的顺序为有效的新交易建立一个池,即交易池。

挖矿竞争随着新区块的传播而结束。 (如何知道?你需要维护区块链的完整记录,并不断监控网络上的交易以确保你是最新的区块链状态,并准备好挖掘新区块。)每个挖矿节点将在传播新区块(宣布获胜者,新区块开始诞生),在本地复制一个区块作为候选区块,(如果能获得第一名并解决工作量证明方案,就真的成为一个块),并继续记录新块。 交易,完善区块头信息,解决区块“难”的工作量证明,同时也为下一个新的新区块提前收集交易并放入交易池(注意不要重复上一个区块)交易,确保留在内存池中的任何交易都未经确认,等待记录在新区块中)。

由于区块大小有限,矿工需要为内存池中的每笔交易分配优先级,并选择优先级高的交易记录构建候选区块。

交易优先级:

交易输入值高,“区块年龄”大的交易优先级高。 如果区块中有足够的空间,高优先级交易不需要 gas 费。

优先级 = Sum(inout * Input 的值) / 事务大小;

交易输入值的单位用比特币单位“聪”表示。 UTXO 块龄是 UTXO 被记录到区块链之前经历的块数。 交易记录的大小以字节表示。 优先排序选择矿工费高的交易填充剩余区块。 块大小的上限是 MAX_BLOCK_SIZE。 其余按照“每千字节矿工费”

交易存储在交易池中时,还没有经过验证,所以用户处于未验证状态,存储在内存池中。 有可能节点会重启,这个事务会被抹掉,或者因为有优先级,所以一直放在内存池里,太久不处理,就会消失。 这时,钱包软件应该重新发送交易或偿还更高的矿工费以提高优先级。

硬币创建交易或 coinbase 交易用于奖励矿工创建新区块。 每开采 210,000 个区块,奖励金额将减半。

当区块头中的信息被填满后,就可以开始挖矿了。 挖矿的目标是找到一个随机数,使得区块头哈希值小于难度目标。 挖矿节点通常需要尝试数十亿个不同的nonce值,直到找到满足条件的nonce值。

工作量证明算法:根据一定的规则设定一个目标,通过将随机数(0、1、2、3……向上计数)追加到一串数字上来计算它的哈希值。 当计算出的哈希值小于这个目标时,证明一定的工作量已经完成。

随着计算能力的提升,针对区块头基本结构限制的解决方案被开发出来——随机值提升方案。 解决随机数变化不够的情况:经过一轮计算,nonce已经到达底部,然后通过向后的时间戳重新计算该值,达到目标的目的,但是随着难度增加,时间不断往后移,Stamping 会因为太旧而使区块无效,所以使用 coinbase 脚本可以存储的 2-100 字节作为额外随机值的来源。

那么如何设定目标值呢?

通过难度目标,标记值存储为系数/指数,前两位十六进制数字的幂次方,后跟六位系数。 例如0x1903a30c,计算难度目标的公式为:

目标 = 系数 * 2^(8 * (指数 - 3));

想要将比特币网络中的挖矿速度维持在十分钟左右的一个区块

每发现2016个区块,难度都会根据前2016个区块的实际使用时间进行调整。

当工作量证明挖矿完成后,将传播到其网络中的相邻节点,并且在相邻节点被验证后,它也将传播到其相邻节点并扩散到网络中。 以确保传播的节点是有效的。

如何验证新区块?

在CheckBlock函数和CheckBlockHead函数中获取验证条件。

将区块聚合到具有最大工作量证明的链中

一旦一个节点验证了一个新块,它将尝试将新块连接到现有区块链,将它们组装在一起。

那么新区块会连接到哪条链上呢?

每个节点会维护三种类型的区块:1.连接到主链,2是从主链(备份链)分支出来的,3是在已知链中没有找到父区块。 主链是积累难度最大的区块链。 主链和备链是相对的。 When the accumulated difficulty is greater, it will become the new main chain, and the rest will be the backup chain. If a node receives a block, but its parent block cannot be found, the block is called an "orphaned block". The orphaned block will be stored in the orphaned block pool until its parent block is found by the node.

blockchain fork

It is inevitable that two nodes (set as A, B) will be generated at the same time for the same parent block (set as P), and the opportunity to complete the proof of work of the new block at the same time, to broadcast to the network, then two blocks will be formed Fork, there will be p-"A, p-"B, two different chains, both of which are legal. At this time, the two chains on the network will immediately be put into new acquisitions to extend their own length, the competition becomes the main chain. The remaining one will become the backup chain. At this time, these nodes accept the new and longer chain and change the original view of the blockchain. This is called the re-consensus of the chain. The result is: the candidate block on the backup chain will become an orphan block, because its parent block is on the backup chain and cannot be found on the main chain. All the miners who used the backup chain will stop and use it as the main chain. 链。