我了解非对称密码系统和数字签名的工作原理:
生成(私钥、公钥)对。你从不共享私钥,你把公钥。。。好吧,公开。
您有一组函数:
encrypt(公钥,纯文本)=密文
解密(私钥,密文)=纯文本
sign(私钥,纯文本)=有符号文本
验证签名(公钥,签名文本)=签名有效吗
然而,在比特币中,地址是公钥的散列版本。没有办法“撤消”散列。因此,我不确定如何验证交易。
我想接下来的问题是,当我想做一笔交易时,到底是什么传输给了谁/存储了什么。我想:
输入比特币地址
输出比特币地址
使用所有输入地址私钥的事务签名(我猜是按输入的顺序)
… 但我不知道验证是怎么完成的。因此,我假设您在创建事务时发送了公钥。这将解释为什么你不应该使用任何地址后,你花了钱从它再次。让我困惑的是,我在这里没有看到任何公钥
接下来不清楚的是顺序。签名的应用是否有一个隐含的顺序?我以为这可以通过脚本来完成,但我在块资源管理器中看不到这一点。
有人能解释一下吗?
非答案
区块链交易验证是如何进行的?:接受的答案只是说“当节点听到一个新事务时,它会检查以确保签名有效”。我的问题是如何在没有公钥的情况下实现这一点。
交易
交易验证
验证
分享
改进这个问题
跟随
4小时前问的
马丁托马
10344青铜徽章
新贡献者
添加评论
2个答案
4
当您从比特币地址消费时,您的交易既包括与您试图从中消费的哈希地址对应的公钥,也包括可以用该公钥验证的签名。
你的链接是一个块,它本身没有签名。但是,让我们看看您所在区块中的一个事务:https://www.blockchain.com/btc/tx/b8f925d09c647904e428d902c8404fc91e5dbe53773b82d717cf133747785ca20
向下滚动至“inputs”,在Sigscript下,3045022100c89735ddbb5e231044610590c086d41f1e871067987087ed48e041f8999314830220011deba08ad9a67ddafe51dc530f3f60c8974373bf2f25953a89c139d238216201是ECDSA签名,023aa5b3f24a2b8fc8f64b69ba383b148892deef94cf060288cc99e81be0f9722e是地址对应的公钥。
分享
改进这个答案
跟随
1小时前回答
IEAT披萨
111344银牌1010铜牌
添加评论
2
比特币交易将创建输出,这些输出稍后可以用作新交易的输入。每个输出都将被锁定到所谓的scriptpubkey,它基本上设置了必须满足的密码谜题(即,运行时返回true),以便使用这些硬币。任何花费这些硬币的交易都需要提供一个scriptsig(解锁脚本)来满足这个难题。
因此,例如,当创建一个向“pay to public key hash”(P2PKH)比特币地址付款的事务时,网络将不知道与该地址相关的公钥。但是,当这个输出后来被用作新事务的输入时,解锁这些硬币的scriptsig将包括pubkey和一个有效的签名,因此网络节点将能够验证这些硬币的合法拥有者是否在进行消费(通过对提供的pubkey进行散列,以及验证哈希输出是否与硬币锁定到的比特币地址匹配)。
关于签名的顺序,以下是一些问题/答案,其中有一些很好的细节:
在segwit事务中,哈希和签名究竟是什么
需要一个逐步赎回原始交易的示例
如何兑换基本Tx?
如何通过NBitcoin签署SegWit交易?
Segwit输出的签名摘要是什么
我发现的其他相关问题:
脚本是如何工作的?
scriptSig和scriptPubKey之间的关系是什么?
分享