《Master Bitcoin》学习笔记02——比特币的交易模型

时间:2022-03-11 13:10:19

比特币的交易模型

模型基本描述

  前面一篇学习笔记01提到了一个交易模型(第三章的内容),在第五章中,除了对这个模型做个详细介绍之外,其实和我上一篇理解的交易模型差不多,一个交易包含输入与输出,比特币是在各个地址之间转移,不想中心化系统例如银行有个服务器,记录了每个人的账户,账户这个结构体包含:交易记录,账户余额等一切信息,但是在比特币交易网络这种去中心化的体系中,比特币的交易记录,一个账户拥有多少比特币等信息存储在了区块链中,要像银行账户一样,查询自己账户的相关信息,只能通过查区块链中的区块获取,就像从数据库里查询数据一样,就像下面比特币的交易模型描述。

《Master Bitcoin》学习笔记02——比特币的交易模型

  模型图有几个重点:

  • 个人可用的比特币是以账单形式存在的,在发起交易时,查询区块链中个人可用账单(账单输出账户是你),使用账单来支付相应比特币,产生输出,实际上,是比特币在比特币地址之间的转移。
  • 本次交易的输入就是上次交易输出,比特币账户(地址)查询余额和交易,就是对区块链里账单里对你账户输出的查询(上图中,对A可支配比特币的查询账单输出:退给A的金额,对B可支配比特币的查询账单输出:转账给B的金额)
  • 本次交易的输入可以只有一张账单的输出(如果这张账单上的比特币足够),也可以包含几张账单的输出(几张账单加起来比特币>=此次需要支付金额),注意到,上面的>=比交付,因为不太可能利用已有账单完全无误差地凑出本次需支付对应金额,因为账单里的输出金额是不可拆分的,只能利用账单来支付,要将银行里控制的个人账户余额(一串数字)与比特币个人账户余额(账户下的账单输出)区分开来。
  • 生成的账单三中有给矿工的奖励,这个奖励是你自定的,给不给,给多少都行,这个奖励影响的是交易的优先级,奖励越多,越能尽早地将账单加入区块链中,以保证交易的完成。账单将会被保存在矿工的矿池中,按照奖励优先级来处理账单。

交易输出的锁定与解锁(重点)——锁定脚本与解锁脚本

  上面提到了,一个账户可支配的比特币来源于账单的输出,而账单是公开的,每个比特币账户都能知道这笔交易以及交易的输出,那么怎么保证输出只有对应的比特币的账户能用呢?

  比特币的锁机制是通过一种类Forth语言脚本来,该脚本语言是种非图灵完备的语言,什么是图灵完备的语言呢,当一门编程语言在不限制内存和不限制时间下,能够解决所有问题,就称为图灵完备的,例如:C/C++,JAVA都是图灵完备语言,反之就是图灵非完备,比特币脚本里没有循环,所以这个脚本不能解决:在满足某种条件下退出循环,否则无限制地循环的问题。比特币的脚本语言是一种简单、低级的语言,它的很多功能已经被编译成立二进制文件,即使我们不了解这种语言,只要能够调用接口就行了,或者可以直接使用C/C++,JAVA这样的语言来完成锁定和解锁的功能。那么为什么不直接用C++等图灵完备的语言呢?这是出于安全考虑的,因为C++,JAVA等语言与内存、操作系统等运行环境,息息相关,而比特币脚本不需要任何运行环境都能运行,这就能抵抗基于内存的攻击或者其他透过系统漏洞的攻击(书上是这样解释的,我觉得,比特币脚本更像一串机器语言的0-1串,由于低级机器语言的限制,很难进行高级编程,同样的,也保证了安全性,因为0-1机器语言很难入侵更改)。

  下面是锁定脚本与解锁脚本的例子,以说明锁的交互机制。

  假设这笔交易为A向B支付比特币,在交易双方完成交易,生成账单时(非矿工加的解锁和锁定脚本),A向这个账单加上了锁定脚本,这个锁定脚本包含B的比特币地址C,因为B只公开了经过对公钥HASH后的比特币地址C,因为HASH函数的性质,比特币网络上的任何人,都不能通过C逆向得到B的公钥,也就是说,只有B知道自己的公钥能够构建解锁脚本,即只有B的公钥,才能通过HASH运算出地址C,只有能运算出地址C的比特币账户,才能支配这笔比特币。

脚本语言运行

  该脚本语言仅由常数以及操作构成,从前往后遍历脚本,若遇到常数,则将常数入栈,若遇到操作,根据操作的具体要求,对栈顶元素进行弹出,或者弹出两个元素进行运算,再入栈,当一句脚本运行完毕后,仅只剩下栈顶元素,其取值为True\False,很清楚地,True代表验证成功,代表执行脚本的用户具有该账单输出比特币的支配权,用户能够使用该账单作为下笔交易(账单)的输入,下面是个具体例子

《Master Bitcoin》学习笔记02——比特币的交易模型《Master Bitcoin》学习笔记02——比特币的交易模型

锁定/解锁脚本类型

1)P2PKH (Pay-to-Public-Key-Hash)——比特币网络上大多数交易都属于此类型

  解锁脚本,锁定脚本

《Master Bitcoin》学习笔记02——比特币的交易模型

《Master Bitcoin》学习笔记02——比特币的交易模型

《Master Bitcoin》学习笔记02——比特币的交易模型

2)P2PK(Pay-to-Public-Key)

  写成收款方的公钥,收款方通过自己的私钥生成相应公钥来获取支配权。

《Master Bitcoin》学习笔记02——比特币的交易模型

3)P2SH(Pay-to-Script-Hash)

  这个脚本类型用于多重签名才能支付,比如,一个公司的账户,由5个人支配,但只要有2个人以上的签名就能进行比特币支付。

  我们考虑使用2)的方式来写多重签名命令:

《Master Bitcoin》学习笔记02——比特币的交易模型

  就是说,再使用上图方式多重签名的时候,需要将所有人的公钥都加在锁定脚本里,因为Attorney Public Key时是所有人的公钥运算的结果,而Public Key(公钥)有260bit长,这样下来,在人很多的情况下,甚至会使锁定脚本容量超过账单本身,而且这样的脚本也难以维护,并暴露所有人之间的联系(尽管比特币地址是匿名的)。

  P2SH很好地解决了这个问题,P2SH分为除了锁定脚本、解锁脚本之外,多出了赎回脚本:

《Master Bitcoin》学习笔记02——比特币的交易模型

  使用方法是分两步:①使用赎回脚本确认用户能在属于定义好的群组;②使用解锁脚本解锁(Sig1 Sig2是2个群组用户的签名)

《Master Bitcoin》学习笔记02——比特币的交易模型

《Master Bitcoin》学习笔记02——比特币的交易模型的更多相关文章

  1. AMQ学习笔记 - 02. JMS客户端编程模型

    概述 客户端编程模型,是讲如何使用JMS API实现Java应用程序和JMS Provider的通信. 消息传送模式 消息传送模式又称为消息传送域,JMS API定义了两种模式:PTP和Pub/Sub ...

  2. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  4. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  5. SaToken学习笔记-02

    SaToken学习笔记-02 如果排版有问题,请点击:传送门 常用的登录有关的方法 - StpUtil.logout() 作用为:当前会话注销登录 调用此方法,其实做了哪些操作呢,我们来一起看一下源码 ...

  6. Redis:学习笔记-02

    Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...

  7. GIS案例学习笔记-多边形内部缓冲区地理模型

    GIS案例学习笔记-多边形内部缓冲区地理模型 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:对于多边形,建立内部缓冲区. 问题:ArcGIS缓冲工具不支持内部 ...

  8. OGG学习笔记02

    实验环境:源端:192.168.1.30,Oracle 10.2.0.5 单实例目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1.模拟源数据库业务持续运行 2.配置OGG前 ...

  9. [Golang学习笔记] 02 命令源码文件

    源码文件的三种类型: 命令源文件:可以直接运行的程序,可以不编译而使用命令“go run”启动.执行. 库源码文件 测试源码文件 面试题:命令源码文件的用途是什么,怎样编写它? 典型回答: 命令源码文 ...

随机推荐

  1. JAVA基础知识之NIO——Buffer.Channel,Charset,Channel文件锁

    NIO机制 NIO即NEW IO的意思,是JDK1.4提供的针对旧IO体系进行改进之后的IO,新增了许多新类,放在java.nio包下,并对java.io下许多类进行了修改,以便使用与nio. 在ja ...

  2. IOS杂笔- 7(类方法load与initialize的区别 浅析)

    在介绍两种类方法之前,NSObject Class Reference里对这两个方法说明: +(void)initialize The runtime sends initialize to each ...

  3. 【贪心】Bzoj 2457:[BeiJing2011]双端队列

    2457: [BeiJing2011]双端队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 209  Solved: 95[Submit][Stat ...

  4. python应用之文件属性浏览

    import time,os def showFilePROPERTIES(path): for root,dirs,files in os.walk(path,True): print('位置:' ...

  5. IOI2014 day2 task4 Holiday

    题目 题目链接 大意:从左到右有\(n\)个城市,一开始在城市\(start\),每一天有两种选择: 前往相邻的城市. 访问当前城市(每个城市只能访问一次),访问城市\(i\)可以获得\(attrac ...

  6. BOM基础知识

    1.什么是BOM      BOM(Browser Object Document)即浏览器对象模型.      BOM提供了独立于内容 而与浏览器窗口进行交互的对象:      由于BOM主要用于管 ...

  7. uva1025 动态规划

    这道题的边界是dp(T,N)=0,状态dp(i,j)表示在时间i.第j个车站最少等待时间,有三个决策:1.等1分钟 2.如果有向左的车,向左 3.若果有向右的车,向右  转移方程就是dp(i,j)=m ...

  8. metamask的使用

    Metamask 我是在火狐浏览器安装它的,所以一开始安装了Firefox:http://www.firefox.com.cn/ 然后是下载metamask,它的官方网站是https://metama ...

  9. Flask学习笔记(3)--路由

    0x01 参数传递 传递参数的语法是: /<参数名>/,然后在视图函数中,也要定义同名的参数. 参数的数据类型: 1.如果没有指定具体的数据类型,那么默认就是使用string 数据类型. ...

  10. vs问题集

    ******将获取的所有的','换成'<br/>'********** data.Data.StandardSeating.replace(/,/g,"<br/>&q ...