2020 区块链 golang 版本(5)

zidea · · 992 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

封面

协议

如果发行数字货币也采用中心机构以发行传统货币的方式来发行数字货币,可能会存在哪些问题。其中一个最大问题就是双花问题,也就是用户通过复制数字货币(文件)形式进行多次支付。术语上称为花两次攻击(double spending attack)。要解决双花问题,可以由中心结构对数字货币加编码,中央结构需要维护一张表来记录每一个数字货币的去向,也就是每张货币的所有者。这样做势必带来繁重工作,如果采用去中心化的比特币来通过挖矿来实现对发币的控制。

通过维护数据结构记录并查询每一个数字货币的去向,只不过现在的数据结构不是由中央结构来维护而是由每一个节点来共同维护。这个数据结构就是区块链。

比特币交易中都需要输入(input)和输出(output)两个部分

  • 输入部分要说明币的来源
  • 输出部分需要给出收款人公钥的hash(PubKeyHash)
transaction_001.png
  • 第一笔交易 Alice 通过挖矿获取奖励得到 10 个比特币
  • 然后 Alice 通过交易将比特币支付给 John 和 Mike 每人个 5 个比特币,并进行签名
  • 随后 John 在下一个区块进行将比特币支付给 Mike 2 个比特币,剩余支付给了 Jerry

图中有两种 hash 指针,一种是连接各个区块之间hash 指针,这里还有第二种 hash 指针,是指向前面的交易是为了说明比特币来源,为什么要说明币来源。证明钱不是并空得到而更重要是可以防止双花问题。

我们再看一下图中转账信息,转账信息需要有 Alice 签名同时还需要有 John 和 Mike 的地址。比特币中地址是通过收款的公钥推算出来的。例如 John 地址是通过对 John 公钥取 hash 然后通过转换而得来的。地址就等同我们了解的银行账号,如果 Alice 想要给 John 转钱,就需要 John 的账号。Alice 是如何知道 John 地址?那么John 需要知道 Alice 什么信息吗? 带着这些问题我们继续向下进行。其实 John 需要知道 Alice 的公钥。因为 Alice 公钥代表 Alice 的身份,John 只有知道付款人的公钥才能知道比特币的是谁支付的。而且所有节点都需要知道 Alice 的公钥,这样便于验证。

屏幕快照 2020-04-26 下午8.38.42.png

那么怎么才能知道 Alice 公钥就是接下来问题。其实就是输入中可以找到 Alice 的公钥,通过公钥我们知道这笔交易是随来支付,付款人 Alice 给出自己的公钥来说明是谁这笔交易进行支付会不会存在问题。如果 John 的朋友伪造一笔交易(Alice 支付给 John),用自己公钥说是 Alice 的公钥,然后用自己私钥进行签名来进行转账给 John。避免这个问题发生,交易分为输入和输出两个部分,输入部分需要给出公钥说明比特币来源,给出部分给出收款人公钥的 hash。Alice 支付给 John 交易来源她挖矿所得奖励的交易。说以 Alice 转账给 John 交易中输入公钥要给出挖矿奖励交易的输出公钥 hash 对的上,如果对不上就说明是伪造的交易。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:zidea

查看原文:2020 区块链 golang 版本(5)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

992 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传