cryptography - 比特币中的公钥真实性
问题描述
我对比特币(区块链)领域的公钥密码学有一个基本的困惑。
例如,我了解到,在比特币中,当 Bob 想要进行交易时,他会发送一个包含以下内容的交易:
- 普通交易消息(例如 Bob 向 Alice 发送 5 个比特币)。
- Bob 的公钥
- 交易的数字签名,使用 Bob 的私钥签名
我了解整个比特币网络将根据 Bob 的公钥和数字签名验证此交易,该签名与整个网络中的普通交易信息一起广播。
但是,如果上述交易(Bob 向 Alice 发送 5 个比特币)是由 Eve 发起的呢?Eve 广播纯交易消息、她的公钥、使用她的私钥签名的数字签名。似乎整个比特币网络也将根据提供的信息验证交易。
你能澄清一下我有什么样的错误想法吗?
非常感谢!
干杯,M。
解决方案
一切都是正确的。但是,Bob 不能发送任何公钥。他必须提供与地址相关的 Pubkey,从该地址中提取 5 BTC 以进一步发送。在 Bitcon 设计中,地址是公钥的哈希值。
结果,Eve 不知道 Bob 地址的 pubkey,并且她无法发送交易,这花费了 Bob 的钱。但是,当然,她可以使用 pubkey 发送交易以获取她拥有的地址。换句话说,夏娃可以花她自己的钱,这没关系。
如果您将看到比特币脚本的详细信息,您将看到典型的支出脚本:
ScriptPubKey = OP_DUP OP_HASH160 OP_EQUAL OP_CHECKSIG
此脚本复制 pubkey,散列一份副本,将散列副本与 btc_address 进行比较,如果相等 - 检查签名。如您所见,没有任何公钥可以接受。
推荐阅读
- java - 如何像这样使用 swing 创建一个简单的文件夹选择器?
- java - Java Matcher 类与简单模式不匹配
- ethereum - 在 web3/metamask 中获取合约对象
- generics - 为多种类型实现泛型
- c++ - 使用映射参数的转换构造函数给出错误
- html - 什么是“动画”网站主题或设计?
- arrays - Angular 11 - 我的 highcharts 中的图例已分组,输出未显示
- foreach - Summernote 按钮在淘汰赛循环中不起作用
- javascript - 禁用存在于跨源 iframe 标记内的锚标记
- mysql - 如何形成只从两个链接表中选择第一个条目的查询?