用Go构建区块链——4.交易1
本篇是"用Go构建区块链"系列的第四篇,主要对原文进行翻译。对应原文如下:
Building Blockchain in Go. Part 4: Transactions 1
1、介绍
交易是比特币的核心,区块链的唯一目的是以安全可靠的方式存储交易,所以没有人可以在创建后修改它们。今天我们开始实现交易。但是因为这是一个相当大的话题,所以我将它分成两个部分:在这一部分中,我们将实现交易的通用机制,第二部分我们将详细讨论。
而且,由于代码变化很大,因此在这里对它们解释是没有意义的。你可以在这里看到所有的变化。
2、没有勺子("There is no spoon")
(译者注:There is no spoon,字面意思“没有汤勺”,是《黑客帝国》的一句台词。这里应该可以翻译为类似"无限力量或者魔法无限"的意思吧)
如果您曾经开发过Web应用程序,为了实现支付系统,您可能会在DB中创建这些表格: accounts
和 transactions
。一个账户会存储关于用户的信息,包括他们的个人信息和余额,而一个交易会存储关于从一个账户向另一个账户转移资金的信息。在比特币中,付款是以完全不同的方式实现的。这里:
- 没有帐号;
- 没有余额;
- 没有地址;
- 没有货币;
- 没有发送者和接收者。
由于区块链是一个公开和开放的数据库,我们不希望存储有关钱包所有者的敏感信息。货币不会存在帐户中。交易不会将资金从一个地址转移到另一个地址。没有可保存帐户余额的字段或属性。只有交易。但是交易内容是什么?
3、比特币交易
交易是输入和输出的组合:
type Transaction struct {ID []byteVin []TXInputVout []TXOutput
}
一笔新的交易的输入引用前一笔交易的输出(这里有个例外,我们将在后面讨论)。输出是货币实际存储的地方。下图演示了交易之间的的关系:
![](/assets/blank.gif)
注意:
- 有一些输出没有关联到输入;
- 在一笔交易中,输入可以引用之前多个交易的输出;
- 一个输入必须引用一个输出。
在整篇文章中,我们将使用诸如"钱","货币(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相关推荐
- 基于Java语言构建区块链(四)—— 交易(UTXO)
基于Java语言构建区块链(四)-- 交易(UTXO) 2018年03月11日 00:48:01 wangwei_hz 阅读数:909 标签: 区块链比特币 更多 个人分类: 区块链 文章的主要思想和 ...
- 基于Java语言构建区块链(六)—— 交易(Merkle Tree)
基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...
- 基于Java语言构建区块链(五)—— 地址(钱包)
基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...
- fcn从头开始_如何使用Go从头开始构建区块链
fcn从头开始 介绍 (Introduction) With Web 3.0 and blockchain becoming more mainstream every day, do you kno ...
- 基于Go语言构建区块链:part5
Golang语言和区块链理论学习完毕后,快速入门方法无疑是项目实战.本文将参考https://jeiwan.cc/tags/blockchain/教程,学习如何基于Go语言构建区块链. 1.引言 本文 ...
- 从构建区块链理解区块链概念
从构建区块链理解区块链概念 import hashlib import json from datetime import time from urllib.parse import urlparse ...
- 用Python构建区块链
区块链 区块链是在计算机网络的节点之间共享数据的分类账(分布式数据库).作为数据库,区块链以电子格式储存信息.区块链的创新之处在于它保证了数据记录的安全性和真实性,可信性(不需要没有可信任的第三方). ...
- 通过JavaScript学习构建区块链
通过JavaScript学习构建区块链 [中英双语]通过JavaScript 学习构建区块链 用 JavaScript 编程语言编写您自己的区块链和去中心化网络. 此教程共8.0小时,中英双语字幕,画 ...
- 银心科技与黑萤科技达成战略合作,联合构建区块链数据库存储生态至高点
银心科技与黑萤科技达成战略合作,联合构建区块链数据库存储生态至高点 元为开始,旦为天明,2019年元月,分布式存储领域利好不断,先是海外知名项目.全球首个区块链数据库存储ORA甲骨链在熊市逆势获得千万 ...
最新文章
- 【干货】CNN与Transformer的强强联合!谷歌最新开源BoTNet,ImageNet达84.7%准确率
- 揭秘丨“北京八分钟”里中国制造的科技力量
- 团队招人的笔试题,我的回答。
- 百度超级链XChain(2)p2p网络
- datatable删除一行数据
- spark多个kafka source采用同一个group id导致的消费堆积延迟
- 全民上云时代,如何降低成本?
- Android 系统(51)Android窗口机制
- 小程序点击获取循环列表中的内容
- mybatis plus当月数据查询_mybatis plus的3种查询方式(小结)
- 2020 年物联网设备达 500 亿台!AI、区块链技术加持,优秀开发者稀缺!
- python 正则re模块 group() groups()
- WPS Excel+windows批处理批量重排序文件夹
- 蓝牙耳机无法与计算机连接,蓝牙耳机怎么连接电脑【图文教程】
- PHP工程师的最佳学习路线
- PIPIOJ1099PIPI的油田
- vue3:兄弟组件,跨组件传值,事件总线的通信方式(mitt / tiny-emitter)
- 你的计算机毕业设计怎么写——教你点科技与狠活
- px4调用Gazebo实现四旋翼定点悬停到时降落
- 这些有趣的AI人脸特效背后,腾讯云都做了什么?
热门文章
- 最流行的10种Android恶意软件类别解释
- [SHOI2003]吃豆豆
- 广州iOS培训之免费参加啦
- yyyyMMddHHmmss转yyyy-MM-dd HH:mm:ss格式
- CUDA ERROR: device-side assert triggered at 和unable to get repr for <class ‘torch.Tensor‘>问题及解决思路
- [Luogu P3147] [BZOJ 4576] [USACO16OPEN]262144
- h5网站对服务器要求高么,专业网页设计师告诉你,H5究竟是什么?
- javascript中双感叹号(!!)作用
- 五金件视觉检测_五金配件视觉检测_五金冲压件视觉检测
- 施瓦兹:Android不需要使用Java API的许可