本篇是"用Go构建区块链"系列的第四篇,主要对原文进行翻译。对应原文如下:

Building Blockchain in Go. Part 4: Transactions 1

1、介绍

交易是比特币的核心,区块链的唯一目的是以安全可靠的方式存储交易,所以没有人可以在创建后修改它们。今天我们开始实现交易。但是因为这是一个相当大的话题,所以我将它分成两个部分:在这一部分中,我们将实现交易的通用机制,第二部分我们将详细讨论。

而且,由于代码变化很大,因此在这里对它们解释是没有意义的。你可以在这里看到所有的变化。

2、没有勺子("There is no spoon")

(译者注:There is no spoon,字面意思“没有汤勺”,是《黑客帝国》的一句台词。这里应该可以翻译为类似"无限力量或者魔法无限"的意思吧)

如果您曾经开发过Web应用程序,为了实现支付系统,您可能会在DB中创建这些表格: accountstransactions 。一个账户会存储关于用户的信息,包括他们的个人信息和余额,而一个交易会存储关于从一个账户向另一个账户转移资金的信息。在比特币中,付款是以完全不同的方式实现的。这里:

  1. 没有帐号;
  2. 没有余额;
  3. 没有地址;
  4. 没有货币;
  5. 没有发送者和接收者。

由于区块链是一个公开和开放的数据库,我们不希望存储有关钱包所有者的敏感信息。货币不会存在帐户中。交易不会将资金从一个地址转移到另一个地址。没有可保存帐户余额的字段或属性。只有交易。但是交易内容是什么?

3、比特币交易

交易是输入和输出的组合:

type Transaction struct {ID   []byteVin  []TXInputVout []TXOutput
}

一笔新的交易的输入引用前一笔交易的输出(这里有个例外,我们将在后面讨论)。输出是货币实际存储的地方。下图演示了交易之间的的关系:

image

注意:

  1. 有一些输出没有关联到输入;
  2. 在一笔交易中,输入可以引用之前多个交易的输出;
  3. 一个输入必须引用一个输出。

在整篇文章中,我们将使用诸如"钱","货币(coins)","花费","发送","账户"等词语。但比特币中没有这样的概念。交易只是用脚本锁定值,只能由锁定它的人解锁。

4、交易输出

首先从输出开始:

type TXOutput struct {Value        intScriptPubKey string
}

事实上,这是存储"货币(coins)"的输出(注意一下上面的 Value 字段)。而存储意味着用一个谜题锁定它们,这是存储在 ScriptPubKey 。在内部,比特币使用称为脚本的脚本语言,用于定义输出锁定和解锁逻辑。这种语言很原始(这是故意的,以避免可能的黑客和滥用),但我们不会详细讨论它。你可以在这里找到它的详细解释。

在比特币中,value字段存储satoshis的数量,而不是BTC的数量。一个satoshis是一亿分之一个比特币(0.00000001 BTC)的,因此,这是比特币的最小货币单位(如百分比)。

由于我们没有实现地址,现在我们将避免整个脚本相关的逻辑。 ScriptPubKey 将存储任意字符串(用户定义的钱包地址)。

顺便说一句,拥有这样的脚本语言意味着比特币也可以用作智能合约平台。

输出的一个重要的事情是它们是不可分割的,这意味着你不能引用它的一部分。在新的交易中引用输出时,它将作为一个整体进行使用。如果其值大于所需要的值,则会生成更改并将其发送回发送者。这与真实世界的情况类似,例如,您支付5美元的钞票用于花费1美元,并且找回4美元的东西。

5、交易输入

这里是输入:

type TXInput struct {Txid      []byteVout      intScriptSig string
}

如上所述,输入引用前一个输出:Txid 存储此类交易的ID,Vout 在交易中存储输出的索引。ScriptSig 是一个提供数据用于在输出中使用的脚本 ScriptPubKey 。如果数据是正确的,输出可以被解锁,这个值也可以被用来生成新的输出;如果不正确,输出就不能被输入所引用。这是保证用户不能花钱属于其他人的货币的机制。

同样,由于我们还没有实现地址, ScriptSig 因此将只存储任意用户定义的钱包地址。我们将在下一篇文章中实现公钥和签名检查。

我们总结一下。输出是储存"货币"的地方。每个输出都带有一个解锁脚本,它决定了解锁输出的逻辑。每个新交易都必须至少有一个输入和输出。输入引用前一个交易的输出,并提供 ScriptSig 输出的解锁脚本中使用的数据(字段),以解除锁定并使用其值创建新的输出。

但哪个先出现:输入还是输出?

6、鸡蛋

在比特币中,先有蛋,才有鸡。输入引用输出的逻辑是典型的 "鸡还是鸡蛋" 的问题:输入产生输出,输出使得输入成为可能。在比特币中,输出先于输入。

当矿工开始挖矿时,它会添加一个 coinbase交易 。coinbase交易是一种特殊类型的交易,不需要以前存在的输出。它无处不在地创造输出(即"货币")。没有鸡的鸡蛋。这是矿工挖到新区块的奖励。

如您所知,区块链开始处有创世区块。这个区块在区块链中产生了第一个输出。由于没有以前的交易并且没有这样的输出,因此不需要先前的输出。

我们来创建一个coinbase交易:

func NewCoinbaseTX(to, data string) *Transaction {if data == "" {data = fmt.Sprintf("Reward to '%s'", to)}txin := TXInput{[]byte{}, -1, data}txout := TXOutput{subsidy, to}tx := Transaction{nil, []TXInput{txin}, []TXOutput{txout}}tx.SetID()return &tx
}

一个coinbase交易只有一个输入。在我们的实现中,它 Txid 是空的,Vout 等于-1。而且,coinbase交易不会存储脚本 ScriptSig 。相反,任意数据存储在那里。

在比特币中,第一个coinbase交易包含以下信息:"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"。你可以自己看。

subsidy 是奖励的金额。在比特币中,这个数字没有存储在任何地方,只根据块的总数进行计算:块的数量除以 210000 。挖掘创世区块产生50 BTC,每 210000 块奖励减半。在我们的实现中,我们会将奖励作为常量存储(至少现在是

用Go构建区块链——4.交易1相关推荐

  1. 基于Java语言构建区块链(四)—— 交易(UTXO)

    基于Java语言构建区块链(四)-- 交易(UTXO) 2018年03月11日 00:48:01 wangwei_hz 阅读数:909 标签: 区块链比特币 更多 个人分类: 区块链 文章的主要思想和 ...

  2. 基于Java语言构建区块链(六)—— 交易(Merkle Tree)

    基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...

  3. 基于Java语言构建区块链(五)—— 地址(钱包)

    基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...

  4. fcn从头开始_如何使用Go从头开始构建区块链

    fcn从头开始 介绍 (Introduction) With Web 3.0 and blockchain becoming more mainstream every day, do you kno ...

  5. 基于Go语言构建区块链:part5

    Golang语言和区块链理论学习完毕后,快速入门方法无疑是项目实战.本文将参考https://jeiwan.cc/tags/blockchain/教程,学习如何基于Go语言构建区块链. 1.引言 本文 ...

  6. 从构建区块链理解区块链概念

    从构建区块链理解区块链概念 import hashlib import json from datetime import time from urllib.parse import urlparse ...

  7. 用Python构建区块链

    区块链 区块链是在计算机网络的节点之间共享数据的分类账(分布式数据库).作为数据库,区块链以电子格式储存信息.区块链的创新之处在于它保证了数据记录的安全性和真实性,可信性(不需要没有可信任的第三方). ...

  8. 通过JavaScript学习构建区块链

    通过JavaScript学习构建区块链 [中英双语]通过JavaScript 学习构建区块链 用 JavaScript 编程语言编写您自己的区块链和去中心化网络. 此教程共8.0小时,中英双语字幕,画 ...

  9. 银心科技与黑萤科技达成战略合作,联合构建区块链数据库存储生态至高点

    银心科技与黑萤科技达成战略合作,联合构建区块链数据库存储生态至高点 元为开始,旦为天明,2019年元月,分布式存储领域利好不断,先是海外知名项目.全球首个区块链数据库存储ORA甲骨链在熊市逆势获得千万 ...

最新文章

  1. 【干货】CNN与Transformer的强强联合!谷歌最新开源BoTNet,ImageNet达84.7%准确率
  2. 揭秘丨“北京八分钟”里中国制造的科技力量
  3. 团队招人的笔试题,我的回答。
  4. 百度超级链XChain(2)p2p网络
  5. datatable删除一行数据
  6. spark多个kafka source采用同一个group id导致的消费堆积延迟
  7. 全民上云时代,如何降低成本?
  8. Android 系统(51)Android窗口机制
  9. 小程序点击获取循环列表中的内容
  10. mybatis plus当月数据查询_mybatis plus的3种查询方式(小结)
  11. 2020 年物联网设备达 500 亿台!AI、区块链技术加持,优秀开发者稀缺!
  12. python 正则re模块 group() groups()
  13. WPS Excel+windows批处理批量重排序文件夹
  14. 蓝牙耳机无法与计算机连接,蓝牙耳机怎么连接电脑【图文教程】
  15. PHP工程师的最佳学习路线
  16. PIPIOJ1099PIPI的油田
  17. vue3:兄弟组件,跨组件传值,事件总线的通信方式(mitt / tiny-emitter)
  18. 你的计算机毕业设计怎么写——教你点科技与狠活
  19. px4调用Gazebo实现四旋翼定点悬停到时降落
  20. 这些有趣的AI人脸特效背后,腾讯云都做了什么?

热门文章

  1. 最流行的10种Android恶意软件类别解释
  2. [SHOI2003]吃豆豆
  3. 广州iOS培训之免费参加啦
  4. yyyyMMddHHmmss转yyyy-MM-dd HH:mm:ss格式
  5. CUDA ERROR: device-side assert triggered at 和unable to get repr for <class ‘torch.Tensor‘>问题及解决思路
  6. [Luogu P3147] [BZOJ 4576] [USACO16OPEN]262144
  7. h5网站对服务器要求高么,专业网页设计师告诉你,H5究竟是什么?
  8. javascript中双感叹号(!!)作用
  9. 五金件视觉检测_五金配件视觉检测_五金冲压件视觉检测
  10. 施瓦兹:Android不需要使用Java API的许可