主页 > imtoken钱包最新下载 > 详细的比特币交易流程
详细的比特币交易流程
今天第二次阅读《精通比特币》这本书,对比特币交易流程有了更清晰的认识。结合我之前的知识,记录一下我的经历。 html
比特币交易过程可以简单用下图表示:算法
这里特别说明,建立账户不被认为是交易过程的一部分,但是因为它们对于理解交易特别重要,所以我也会在这里解释它们。安全
创建一个帐户
比特币建立所有匿名账户。事实上,比特币中所谓的账户是用非对称加密算法(比特币使用的椭圆曲线算法)建立的。一对密钥,分为公钥和私钥。首先,私钥是一个随机数,随机选择一个32字节的数字,然后使用椭圆曲线加密算法(ECDSA-secp256k1)对私钥进行压缩生成公钥。即也就是说,比特币账户的本质就是上面只是一个随机数,没有其他任何信息,这给以后有人用比特币洗钱带来了前所未有的便利,所以一定要妥善保管好私钥。不让别人知道它是你所有的比特币的唯一凭证,公钥是可以暴露给别人的,其实我们平时发给别人的钱包地址,就是公钥经过一系列hash计算和Base58后得到的但是钱包地址不等于公钥,因为上面的过程都是不可逆的,也就是说你不能通过钱包地址推导出公钥,也不能通过公钥推导出私钥.其实,从e私钥到地址,中间有9步计算处理,所以私钥绝对安全,无法破解。数据结构
我们简单总结比特币账户的制作流程如下
生成一个32字节的随机数作为私钥使用椭圆曲线算法对私钥进行加密,生成公钥,对公钥进行一系列哈希计算,生成公钥摘要,并使用Base58编码技术对公钥摘要进行编码得到地址(此步骤可逆) 发送交易
如果有两个账户,A和B,他们的账户信息如下区块链
用户名私钥公钥钱包地址
一个
0xtjnpelimdkygfoqsuhvxzwarcb
0xDNnPoyw0QKVfssQy
0x9SDYFw46EANVMp6P3F754k
B
0xwehsSivmE4IHN1aVzwDEzkVC
0xp7cNc9rpnz23pEHc
0xErho6FVqTqgHTpcLiE2R6A
为了方便理解和记录,我们假设编码
A的私钥、公钥、地址对应:private-key-A、public-key-A、address-A。加密
B的私钥、公钥、地址对应:private-key-B、public-key-B、address-B.code
假设A要给B转账5 BTC,那么付款人会发送这样一笔交易htm
{
"付款地址":"address-A",
"收款地址":"address-B",
"金额":"5BTC"
}
在发送交易之前,A还需要对交易进行签名,以便剩余的接收节点用于验证交易。对于非对称加密算法哪里可以安全的交易比特币,一次加密的数据长度通常是有限的(通常是1024字节),所以在签名之前先通过哈希计算得到交易摘要,然后再对交易摘要进行签名,这样也可以节省计算资源.
summary = hash({
"付款地址":"address-A",
"收款地址":"address-B",
"金额":"5BTC"
}) => "KrDsjT4J7vo6GbibMQMPYkcA2f5bck"
假设摘要信息为: KrDsjT4J7vo6GbibMQMPYkcA2f5bck ,则使用A的私钥对摘要进行签名
signature = sign(summary, private-key-A) -> "RAJ8uRurwWQVQRO5"
@ >
签名后,支付节点会将交易广播给全网节点:我转了5个BTC给B,请过来确认。广播信息包括原始交易信息和签名信息。
p>
当然,以上是模拟的主要数据,实际交易中包含更多信息。下面贴出比特币真实的交易数据结构:
验证交易
其他比特币节点收到广播交易后,会对交易进行验证,主要是验证交易是否是自己发起的。由于用户只拥有私钥,只要验证签名信息正确,就用私钥进行签名。当然,在实际交易过程中还会做一些其他的验证,比如付款人的UTXO(实际上是余额)是否足够。
签名的验证过程一般如下:
summary = hash({
"付款地址":"address-A",
"收款地址":"address-B",
"金额":"5BTC"
})
if (verify(signature, public-key-A) == summary) {
//验证经过
//打包交易到区块
}
这里用来验证签名的公钥是解密的,这是非对称加密的特点之一,如果你不知道什么是非对称加密,请看我之前的博客《区块链技术指南》阅读笔记(< @二)
存储事务
交易验证通过后,当前节点将交易写入账本,然后广播给与其链接的节点,其他节点对交易进行验证、打包、广播,直到全网节点全部确认交易。
如果你爱哪里可以安全的交易比特币,那就献祭;如果你觉得这篇文章对你有用,那就打赏吧。您的支持是对创作者莫大的支持和鼓励。
原文链接: