今天我想介绍区块链如何运作的基本知识,以及它如何以安全的方式追踪资金。 我将介绍UTXO模型,比特币和Qtum使用它。 区块链上还有另一种叫做账户模式的资金管理方式,但这里不会涉及。

首先我想给出一些定义,以免你对比特币一无所知。

  • 单向散列(或简称“散列”) - 一种将数字数量转换为固定长度“摘要”的加密算法。 该算法通过仅给出摘要的方式来做到这一点,不可能确定输入数据是什么,并且此外不可能预测来自给定输入数据的摘要是什么。 最常见的例子是在比特币中广泛使用的SHA256,但还有很多其他的包括SHA3,RIPEMD160,scrypt等等。
  • 公钥密码系统 - 一种密码机制,通过它可以将“私钥”密钥转换为“公钥”并用于证明私钥的所有权而不泄露秘密。 此外,可以使用公钥对数据进行加密,以便只有持有私钥的人才能对其进行解密。 在比特币中,这通常用于签署交易。 有可能通过仅使用签名数据和公钥来证明交易的创建者拥有私密密钥。
  • Merkle root - 一种树型数据结构,它使用单向哈希来保存多个数据片段,使得在不改变merkle根哈希的最终值的情况下,树的输入中的任何数据都不能被修改。
  • UTXO - 未使用的事务输出,事务中未使用的输出
  • Block - 区块链上最小的可验证且不可伪造的单位。 它包含各种数据来证明它的共识以及交易

那么,让我们来谈谈交易如何在这方面发挥作用。 比特币交易在某些方面类似于收银员的支票。 当你想花费一笔交易的“输出”时,你必须花费整个事情。 这与您无法走进银行并说“我想兑现这张支票的一半”类似。 但是,在这种模式下,没有相当于现金或银行账户。 因此,为了在任何地方汇款,您必须“兑现”支票,并从兑现流程中“输出”支票到您预定的目的地,然后再查看自己。

这个“兑现过程”实际上是比特币中的交易。 在一笔交易中,您花费了一次或多次“支票”(实际上称为UTXO),并从这些花费的资金中为新目的地创建一个或多个UTXO。 您在交易中使用的UTXO称为“vins”,您创建的新UTXO称为“vouts”。 一旦UTXO被一笔交易花费,它可以被认为已经消失并被销毁。 你可以在区块链中看到它的历史,但是没有什么可以做到的。

所以,目前我们的系统中存在的一个问题是,检查通常会写出姓名,例如“Jordan Earls”。 任何人当然可以说他们是互联网上的任何名字。 这是我们将公钥加密和编程引入UTXO的地方。 在比特币中,UTXO包含一个脚本或一个计算机程序,如果您可以通过说“真”来使脚本结束,那么这些脚本或计算机程序是可以使用的。 让我们看看最简单的脚本,它可以做一些有用的事情:

 [pubKey] OP_CHECKSIG 

这被称为“pay-to-pubkey”脚本 。 这是第一个标准的比特币交易类型。 第一项是[pubKey] 。 这是公钥的数据。 请记住,每个公钥都有一个私有密钥,它的所有者保密。 发布公钥是安全的,但不公开私钥。 比特币“脚本”语言是基于堆栈的。 所以想象你有一堆文件。 你把公钥写在一张纸上,然后放在堆栈上。 该脚本的下一部分是OP_CHECKSIG。 这个特定的操作将会从堆栈顶部取走两件东西。 它的第一件事就是公钥。 然后,它的第二件事就是加密签名。

不过现在这很混乱。 OP_CHECKSIG从栈中获取2个值(也称为参数),但我们的脚本似乎只有1个值, pubKey 。 这是vin部分变得重要的地方。 您可以将vout脚本想象为支票上的“付款”字段,并将vin脚本想象为您在后面签名的地方,证明您确实是“付款至”字段中的预定方。 在比特币中,脚本只有在花费之后才会执行。 当它被使用时,它首先执行vin脚本,然后将结果数据从vin栈放到vout栈中。 所以在实际执行中,脚本可能看起来很像:

 [signature from vin] [pubKey] OP_CHECKSIG 

人们可以认为vout脚本是一种挑战,而vin则是让vout满足它的答案。 无论如何,现在我们有一个提供签名并尝试花这些资金的vin,我们实际上可以执行脚本。 如果签名和公钥是有效的,那么OP_CHECKSIG将在堆栈上推“真”,导致UTXO成功消耗。

所以在一个交易中,每个vin指定一个以前的UTXO,并提供一个导致UTXO脚本返回“true”的答案。 如果使用了无效签名或类似签名,则脚本将返回“false”并且该事务无效。 部分消费UTXO是不可能的。 它必须完全用完或者保持不动。 这意味着如果你有一个UTXO值10个令牌,并且你想向Bob发送7个令牌,那么你必须进行一个花费这10个令牌UTXO的事务,并创建2个输出。 一个输出给Bob(使用他的公钥)和一个输出给你自己(确保你可以给vout提供一个“回答”来成功地使用它)。 这第二个输出回到自己被称为“更改地址”。

最后,我们有一种使用事务和脚本交换令牌的合理方式。 但是,我们面临一个问题。 当有人向您发送交易输出时,您如何确定其交易的结果只使用未消耗的输出。 这是区块链概念变得重要的地方。

比特币中的一个块有一个标题。 标题包含以下内容:

  • 先前的块头散列
  • 块中所有事务的Merkle根散列
  • 创作时间
  • 困难
  • 杜撰

该块的主体是完整的交易(最终也是证人,但这是另一个话题)。

由于每个块都包含对前一个块的引用,所以不可能秘密修改前一个块。 修改以前的块会改变块散列,从而破坏由块散列组成的“链”。

比特币使用工作证明(PoW)共识系统。 这将在后面的文章中更详细地解释,但基本上它是一个系统,要求块创建过程中的参与者(矿工)投入一定数量的计算工作来解决难题。 解决这一难题的第一位矿工获得了奖励,他们创建的块被添加到网络的区块链中。 必须完成多少工作由块中指定的“难度”控制。

在PoW中,只有块头实际用于共识机制。 merkle root hash确保尽管如此,可以验证块体中的每个事务,并确保每个事务都已收到。

一旦创建了块,交易可以被认为是永久性的。 “双重支出”UTXO的唯一方法是取代发生支出交易的区块。 这在某些情况下可以自然发生(称为孤立块),但由于在包含块的事务之上构建了更多块,因此这种可能性成指数性地降低了可能性,并且此外需要指数级更多的工作来恶意攻击和替换。

这就是为什么许多接受比特币的服务等待3或6个确认(块放置在包含块的交易之上)。 区块链可能被破坏,并且这些资金被另一笔交易花费是难以置信的。

我们只剩下一个问题。 令牌最初来自哪里? 他们来自采矿过程。 作为采矿的一部分,矿工增加了一项名为“coinbase”交易的特殊交易。 这笔交易没有投入,并且允许有一定数量的产出(比特币目前为12)。 这个coinbase交易是流通中的所有代币实际来自哪里。 如果没有令牌,就不会创建任何交易,因此没有任何事情要做。

现在我们有一个功能正常的区块链,它能够安全地保存它的价值,确保双重支出极难执行(并且通过更多确认来增加难度)。 您现在应该足够了解比特币,Qtum和其他UTXO加密货币在协议级别的真实工作原理,并且可以开始查看区块链中更高级的主题。

参考文献:

  1. https://en.bitcoin.it/wiki/Script#Obsolete_pay-to-pubkey_transaction

http://earlz.net/view/2017/07/27/1820/what-is-a-utxo-and-how-does-it

【译】What is a UTXO, and how does it work for a blockchain ledger?相关推荐

  1. Go语言实现区块链与加密货币-Part3(交易优化,单机模拟多节点通信)

    交易(二) 在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库.不过在之前的文章中,我们选择性地跳过了"分布式"这个部分,而是将注意力都放到了"数据库&quo ...

  2. 大咖专访:Bigbang公链创始人“一休”现场解决实际技术问题

    问:区块链的真命题有哪些? 译:What are the true propositions for blockchain? 区块链的真命题啊,其实这个应该要从假命题开始说了, 译:The true ...

  3. 【译】用Java创建你的第一个区块链-part2:可交易

    转自:http://www.spring4all.com/article/814 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.所谓共识机制是区块链系统中实现不同节 ...

  4. 区块链日记——【译】用Java创建你的第一个区块链-part2:可交易

    本文转自http://www.spring4all.com/article/814 [译]用Java创建你的第一个区块链-part2:可交易 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计 ...

  5. java程序a-z b-y_有一行电文,以按下面规律译成密码: A---Z a---z B---Y b---Y C---X c---x …… 即第1个字母编程第26个字...

    有一行电文,以按下面规律译成密码: A--->Z a--->z B--->Y b--->Y C--->X c--->x -- 即第1个字母编程第26个字母,第i个字 ...

  6. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)

    使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性.这种交叠有一个很好的例子就是 HttpAppl ...

  7. 【译】Monolith first —— Martin Fowler 对于微服务架构的看法

    转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[译]Monolith first -- Martin Fowler 对于微服务架构的看法 整体架构先行(Monolith fir ...

  8. TWAIN Specification Chapter 4 “Advanced Application Implementation”译——应用程序端的高级实现...

    本文是对TWAIN规范的第四章<应用程序端的高级实现>的翻译.因工作需要了解TWAIN,所以顺便译了一下.这是私人工作,您可以参考,但本人不保证不存在翻译的差错或不合宜.如果您发现有不妥的 ...

  9. (C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

    题目描述 有一行电文,已按如下规律译成密码: A–>Z a–>z B–>Y b–>y C–>X c–>x - - 即第一个字母变成第26个字母,第i个字母变成第(2 ...

最新文章

  1. 斯坦佛编程教程-Unix编程工具(四)
  2. 黄仁勋回应放弃收购Arm:公司战略并没有太大改变
  3. java中file类_Java中file类
  4. 由于昨天没发博客,在此向广大粉丝们道歉。 今天发的是一个数据库的代码
  5. 内部类(闭包与回调)
  6. 简朴的生活、高贵的灵魂是人生的至高境界。——杨绛
  7. 【机器视觉】 dev_set_draw算子
  8. 计算机网络课程设计之网络聊天程序的设计与实现
  9. netlink的内核实现原理
  10. 如何正确的停掉线程?这里面大有门道!
  11. SQL注入漏洞修复办法
  12. 简书bug(已修复):网络不佳时安卓1.11.3呈现的空白页面如图
  13. leaflet地图之 获取经纬度
  14. 虚拟的云xx经济越热闹,现实的自己就越孤独
  15. LabVIEW串口调试助手
  16. 详解 Python 中的 filter() 函数
  17. 矢量控制开发笔记1—SVPWM基础
  18. Wish官方推荐收款渠道 哪家比较好?
  19. GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之一)。
  20. Linux基础,系统概叙与虚拟机搭建+CentOS系统安装(建议收藏)

热门文章

  1. Objective-C知识总结(5)
  2. HtmlAgilityPack 之 HtmlNode类
  3. 病毒汇编逆向分析实例赏析
  4. 获得主机域名及其IP和Port端口
  5. Win10+tensorflow:SSD调试问题:Unable to open table file ../checkpoints/ssd_300_vgg.ckpt
  6. 多台工作站搭建MPI并行环境
  7. Linux下VTK、ITK的安装及运行 转载
  8. 转:c/c++ 运行库
  9. 从STL中查找、统计和过滤重复(相同)的数据
  10. [云炬创业学笔记]第三章商业创意的发掘与评估测试4