主页 > 安卓版imtoken > 一、比特币地址的地址生成步骤及生成系统的应用

一、比特币地址的地址生成步骤及生成系统的应用

安卓版imtoken 2024-01-12 05:14:19

区块链中最基本、最重要的概念是地址、交易、区块和网络。 比特币使用地址来识别交易的发送者和接收者。 所有的交易最终都需要记录在一个统一的账本(区块链)上,这个账本是通过区块来确认和完成的。 每一个新区块的生成都会被打上时间戳(区块头中的一个字段是实时的,后面会详细介绍),最后会生成一个按时间排列记录的电子交易凭证。 每个独立的节点通过比特币网络连接起来,形成一个去中心化、分布式的电子交易记录时间戳服务器系统。

注:文章正文引用自《张健.区块链,定义为金融经济新格局[M].北京:机械工业出版社.2016:162-177》,中间有增删,并且添加的内容直接放在文章末尾,不添加链接。

1. 地址

生成比特币地址的步骤如下:

生成椭圆曲线私钥和公钥。 公钥通过SHA-256哈希算法处理得到32字节的哈希值。 对于得到的哈希值,使用RIPEMD-160算法得到一个20字节的哈希值——Hash160。 对版本号+Hash160组成的21字节数据进行双重SHA-256哈希运算,将得到的哈希值的前4字节作为校验和放在21字节数据的末尾。 Base58编码形成的25字节数组即可得到地址。

注:椭圆曲线算法的私钥为32字节。 公钥可以从私钥计算出来。 公钥是 65 字节。 压缩后有33个字节。 它太长了,不能直接用作地址。

YJS_20181112_比特币地址算法

YJS_20181112_比特币地址算法

整个过程如下图所示。 可以看出,地址是通过一系列哈希算法和编码算法从公钥中得到的。 因此,地址实际上是公钥的另一种形式,可以理解为公钥的概括。 我们在花费资产时,使用地址对应的私钥(公钥)进行签名,然后发送到收款人的地址(公钥)。 有关地址生成的更详细说明,请参阅比特币地址生成算法详细信息。

2.事务

在中本聪的白皮书中,比特币被定义为一串数字签名。 每个电子货币的拥有者通过在之前的交易和下一个拥有者的公钥上签署数字签名,并将这个签名附加到交易的末尾,将其转移给下一个拥有者。 通过验证签名,收款人可以验证电子货币的所有者链。 事务的工作图如下。

YJS_20181112_比特币交易原理

YJS_20181112_比特币交易原理

该交易系统的问题在于,接收方很难验证资产的前任所有者是否进行了双花。 通常的解决方案是引入受信任的第三方(例如银行)来检查每笔交易以防止双重支出。 而如果要排除第三方中介,那么交易信息就应该是公开的,整个系统的所有参与者都需要有一个唯一可识别的历史交易序列。 收款人需要确保在交易过程中系统中的绝大多数节点都同意交易是第一次发生。

2.1 交易结构

比特币交易本质上是汇款。 如果每次转账都需要构造一个交易数据,那就很笨拙了。 为了使价值易于组合和拆分,比特币交易被设计成包含多个输入和输出,即一笔交易可以转移给多个人。 从产生到在网络中传播,再到工作量证明、全网节点验证,最后到比特币区块链,这就是一笔交易的整个生命周期。 交易的本质是一个数据结构,包含交易的发送方、接收方、资产转移等相关信息,数据结构如下表所示。

字段描述大小

版本

sitejianshu.com 区块链公有链和基础链_云服务和区块链_区块链 服务器 构造

本次交易规则

比特币怎样产生利润_比特币qt钱包发币地址_比特币地址是如何产生的

四个字节

柜台内

交易输入(TxIn)列表的数量

1-9 字节

输入清单(出柜)

一个或多个交易输入

不定

输出数量(锁定时间)

交易输出(TxOut)列表数量

1-9 字节

输出列表

一个或多个交易输出

不定

锁定时间

锁定时间

4字节

sitejianshu.com 区块链公有链和基础链_区块链 服务器 构造_云服务和区块链

从整体结构来看,一个交易中的两个主要单元字段是交易的输入和输出。 输入标识交易的发送方,输出标识交易的接收方和对发送方的找零,交​​易费用是输入总和与输出总和的差值。 由于所有交易输入都必须是前一笔交易的输出,因此交易的核心领域是交易输出。 交易的数据结构如下图所示。

YJS_20181112_交易的数据结构

YJS_20181112_交易数据结构

比特币qt钱包发币地址_比特币怎样产生利润_比特币地址是如何产生的

2.2 UTXO结构

比特币系统没有余额的概念,它使用 UTXO 模型(未花费的交易输出)。 UTXO 是比特币交易生成和验证的核心概念。 交易形成一组链结构。 所有合法的比特币交易都可以追溯到一个或多个先前交易的输出。 这些链条的源头是挖矿奖励,链条的末端是当前未花费交易的输出。 所有未花费的输出都是整个比特币网络的 UTXO。

比特币规定每笔新交易的输入必须是一笔交易未花费的输出,每笔输入还需要用之前输出对应的私钥进行签名,每个比特币节点都会将当前的整个UTXO存储在区块上链上,全网节点通过UTXO和签名算法验证新交易的合法性。 下图展示了比特币系统中交易输入输出的过程:

YJS_20181112_比特币系统中交易输入输出的过程

YJS_20181112_比特币系统交易输入输出流程

比特币交易输入通常有三种区块链服务器结构,分别是 Standard TxIn、Spend Coinbase TxOut 和 Coinbase/Generation。 结构体。

YJS_20181112_交易输入之标准输入

YJS_20181112_交易输入标准输入

YJS_20181112_交易输入之产生挖矿奖励

YJS_20181112_交易输入产生的挖矿奖励

YJS_20181112_交易输入之花费挖矿奖励

YJS_20181112_交易输入消费挖矿奖励

比特币交易输出大致有两种类型,标准 TxOut 和 Coinbase TxOut。 下图描述了这两个交易输出的结构。

YJS_20181112_交易输出之标准交易输出

sitejianshu.com 区块链公有链和基础链_区块链 服务器 构造_云服务和区块链

YJS_20181112_transaction 输出的标准交易输出

YJS_20181112_交易输出之挖坑奖励输出

YJS_20181112_交易输出的矿坑挖矿奖励输出

2.3 脚本

脚本是交易中的另一项重要技术。 每笔交易的每笔输出,严格来说,并不是指向一个地址,而是指向一个脚本。 脚本就像一组规则,用于管理收件人如何使用锁定在该输出上的资产。

比特币怎样产生利润_比特币qt钱包发币地址_比特币地址是如何产生的

交易的合法性验证也依赖于脚本。 目前它依赖于两种类型的脚本:锁定脚本和解锁脚本。 锁定脚本基于变量模式,以脚本语言实现,位于交易的输出端。 一个解锁脚本对应一个锁定脚本。 只有按照锁定脚本的规则解决,才能花费脚本上对应的资产,该资产位于交易的输入端。 脚本语言可以表达无数种条件变化。 这也是比特币作为“可编程货币”的特点。 脚本的解释是通过类似于编程领域的“虚拟机”进行的,脚本的执行分布在比特币网络的各个节点上。 有两种常用的比特币脚本。 一种是常见的P2PKH类型(Pay-to-Public-KeyHash),即支付给公钥的哈希值是一个地址,接收方只需要使用该地址对应的私钥即可。 可以通过使用密钥对其进行签名来使用输出。 另一种是P2SH(Pay-to-Script-Hash),支付脚本的哈希值。 以多重签名为例,需要N个私钥中的M个私钥(M≤N)同时签名才能花费资产。 灵活的。 例如在比特币中,P2PKH的脚本规则如下: 一种是普通的P2PKH类型(Pay-to-Public-KeyHash),即支付给公钥的哈希值就是地址,接收方只需要使用对应的私钥即可。

可以通过使用密钥对其进行签名来使用输出。 另一种是P2SH(Pay-to-Script-Hash),支付脚本的哈希值。 以多重签名为例,需要N个私钥中的M个私钥(M≤N)同时签名才能花费资产。 灵活的。 例如在比特币中,P2PKH的脚本规则如下: 一种是普通的P2PKH类型(Pay-to-Public-KeyHash),即支付给公钥的哈希值就是地址,接收方只需要使用对应的私钥即可。 可以通过使用密钥对其进行签名来使用输出。 另一种是P2SH(Pay-to-Script-Hash),支付脚本的哈希值。 以多重签名为例,需要N个私钥中的M个私钥(M≤N)同时签名才能花费资产。 灵活的。 例如,在比特币的区块链服务器构建中,P2PKH的脚本规则如下:使用密钥对输出进行签名即可使用输出。 另一种是P2SH(Pay-to-Script-Hash),支付脚本的哈希值。 以多重签名为例,需要N个私钥中的M个私钥(M≤N)同时签名才能花费资产。 灵活的。

例如,在比特币中,P2PKH 的脚本规则如下:输出可以通过使用密钥签名来使用。 另一种是P2SH(Pay-to-Script-Hash),支付脚本的哈希值。 以多重签名为例,需要N个私钥中的M个私钥(M≤N)同时签名才能花费资产。 灵活的。 例如,在比特币中,P2PKH 的脚本规则如下: 这类似于现实生活中需要多把钥匙同时打开的保险箱,只是更加灵活。 例如,在比特币中,P2PKH 的脚本规则如下: 这类似于现实生活中需要多把钥匙同时打开的保险箱,只是更加灵活。 比如在比特币中,P2PKH的脚本规则如下:

1
2

pubkey script op_dup op_hash160 <pubkeyhash> op_equalverify op_checksig
signature script <sig><pubkey>

P2SH的脚本规则如下:

1
2

pubkey script op_hash160 <hash160redeemscript> op_equal
signature script <sig> [sig] [sig...] <redeemscript>

上述两个脚本规则中,Pubkey脚本代表加锁脚本,Signature脚本代表解锁脚本。 以OP_开头的单词是“虚拟机”可以解析的相关脚本命令和指令。 这些命令规则是根据不同的Pubkey脚本来划分的,同时也决定了解锁脚本的规则。 比特币的脚本机制相对简单。 它只是一个解释相关 OP 指令的基于堆栈的引擎。 可解析的脚本规则不多,无法实现复杂的逻辑。 但是,它提供了区块链可编程性的原型。 一些后续的可编程区块链项目比特币地址是如何产生的,其实都是基于脚本原理开发的。 例如,以太坊深度强化了脚本机制。 它不再只包含简单的OP指令,而是支持脚本语言,可以通过“虚拟机”来执行。 以太坊实现了一个支持图灵完备脚本语言的区块链平台。 脚本机制对于区块链来说非常重要。 类似于区块链技术提供的扩展接口。 任何人都可以基于这个接口开发基于区块链技术的应用,比如智能合约的功能。 脚本机制也让区块链技术成为底层协议。 未来,很多基于区块链的颠覆性应用,都可能通过区块链的脚本语言来完成。 任何人都可以基于这个接口开发基于区块链技术的应用,比如智能合约的功能。 脚本机制也让区块链技术成为底层协议。 未来,很多基于区块链的颠覆性应用,都可能通过区块链的脚本语言来完成。 任何人都可以基于这个接口开发基于区块链技术的应用,比如智能合约的功能。 脚本机制也让区块链技术成为底层协议。 未来,很多基于区块链的颠覆性应用,都可能通过区块链的脚本语言来完成。

3.块

比特币网络中的每个(挖矿)节点都会根据存在的最新区块生成下一个区块,包括网络中未确认的合法交易。 工作量证明完成后,新区块将向全网广播,同时获得区块奖励。 这个过程是所有交易的时间戳。 由于只有最长链上的区块才能得到奖励,所有挖矿节点在利益驱动下形成唯一最长链的结果,从而实现记账系统的共识一致性,保证整个系统的可靠性和安全性. 要理解这些过程,首先需要理解区块链中使用的区块相关结构和相关技术、原理。

3.1 区块结构

比特币地址是如何产生的_比特币怎样产生利润_比特币qt钱包发币地址

比特币网络上的所有合法交易都被打包成一个区块,包含在比特币的公共分类账(区块链)中。 一个区块由一个包含元数据的头部和一个交易列表组成。区块数据结构如下

字段描述大小

区块链 服务器 构造_云服务和区块链_sitejianshu.com 区块链公有链和基础链

魔术代码

固定值 0xD9B4BEF9

4字节

块大小

段后的块大小(以字节为单位)

1-9 字节

笨重

包含6个字段

80字节

交易笔数

交易清单长度

1-9 字节

交易清单

记录在区块的交易信息列表中

不定

块数据的核心示例结构如下图所示。

YJS_20181112_区块数据结构

比特币怎样产生利润_比特币qt钱包发币地址_比特币地址是如何产生的

区块链 服务器 构造_sitejianshu.com 区块链公有链和基础链_云服务和区块链

YJS_20181112_块数据结构

区块由区块头和区块中包含的交易列表组成。 块头大小为 80 字节,由 4 字节版本、32 字节前一个块的哈希、32 字节 Merkle 根哈希、4 字节时间戳(当前时间)和 4 字节当前难度值,一个 4 字节的随机数等。块中包含的交易列表附加到块头。 比特币网络约定每个区块中的第一笔交易是 coinbase 交易,这是矿工获得奖励和费用的特殊交易。

3.2 默克尔树

区块中包含的所有交易都会先通过Merkle Tree算法生成一个Merkle Root Hash,存储在区块头的数据结构中。 Merkle Tree算法是一种同步数据一致性的算法。 它基于一组散列列表构建树,树的根散列是原始数据列表的聚合。 Merkle树具有以下特点:

数据结构是一棵树,可以是二叉树,也可以是多叉树。 Merkle Tree 的叶子节点的值是数据集的单元数据或单元数据的哈希值。 Merkle Tree的非叶子节点的值是所有叶子节点值的哈希值。

区块中使用的Merkle Tree算法的原理如下图所示。

YJS_20181112_Merkle树

YJS_20181112_默克尔树

3.3 时间戳服务器

为了实现点对点电子现金系统,中本聪提出了“时间戳服务器”方案。 时间戳服务器以块的形式随机散列一组数据,添加时间戳,并广播随机散列值。 显然比特币地址是如何产生的,一个时间戳可以确认某个数据在某个时间确实存在,因为只有那个时间才能得到对应的随机哈希值。 每个时间戳应将前一个时间戳合并到其随机哈希中,每个后续时间戳应加强前一个时间戳,形成一条链。

YJS_20181112_打时间戳

YJS_20181112_时间戳

4.网络

比特币采用基于P2P(Peer to Peer)的网络架构。 P2P是指同一网络中的每台计算机都是公平平等的,各个节点共同提供网络服务,不存在“特殊”(中央)节点。 P2P网络通信本身并不是比特币独创的,它在比特币之前就已经被用于文件共享领域。 比特币被设计成一种点对点的数字现金系统,而P2P正是这一概念核心特征的体现和基石。 除了比特币客户端的钱包功能外,每台机器上运行的比特币核心程序都是比特币P2P网络中的一个节点。 各个节点之间的互联构成了比特币网络,保证了整个比特币系统的安全。

比特币网络的相关功能如下:

新的交易被广播到全网节点,每个节点都会收到交易消息。 每个(挖掘)节点将新交易收集到节点的内存中,并将它们组装成块。 每个(挖矿)节点都试图在自己的区块中找到足够难度的工作量证明。 (挖掘)节点找到工作证明并将有效的块数据广播到整个网络。 当且仅当区块中包含的交易有效并且验证工作证明已经完成时,其他节点才会承认区块的有效性。 其他(挖矿)节点表示接受区块并在区块末尾创建新区块以扩展整个区块链。

在比特币网络中,交易和区块信息的传播是通过泛洪算法进行的。 简单地说,每个接收到信息的节点将信息推送给与其相连的所有节点。 下一个接收消息的节点继续这个过程,消息迅速淹没整个网络。 可以看出,传播速度呈指数增长。 通常在一两秒内,有关交易或区块的信息可以在整个网络中传播。

节点总是把最长的链作为正确的链,继续处理它并扩展它。 如果两个节点同时广播基于前一个块的不同新块,则其他节点收到块的时间会有所不同。 在这种情况下,他们将处理收到的第一个块,但也会保留另一条链,以防后者成为最长的链。 僵局被打破,直到找到下一个区块(工作量证明),并且当其中一条链被确认为较长的链时,在另一条分叉链上工作的(挖矿)节点将切换边并开始在较长的链上工作链。 在长链上工作。 所谓的“新交易广播”实际上并不需要到达网络中的所有节点。 只要交易信息能够到达足够多的节点,它们就会很快被整合到一个新的区块中。 块的广播对丢失的信息是容错的。 如果一个节点没有收到特定的块,那么该节点将发现它丢失了该块,并将向较长链上的节点发送请求以下载丢失的块。 比特币网络中的矿工不断地根据最新的区块构建下一个区块,通过算力竞争来争夺记账权(向比特币区块链写入新区块的机会),同时对网络进行确认。 由于每个区块都包含前一个区块的哈希值,通过这个前向哈希值,将区块以链的形式连接起来,最终形成一个由每个区块组成的记账系统——区块链。让这一切运转起来的是我们的共识算法

矿业网络,版权所有丨如未注明,均为原创丨本站采用BY-NC-SA协议授权

转载请注明原文链接:一、比特币地址的地址生成步骤及生成系统的应用