交易Transaction【区块链生存训练】

简介:

日常生活中,我们每天都会与他人进行各种交易,对于“交易”这个概念感觉再熟悉不过了。比如:今天我去吃凉皮,支付给商家5元钱,非常简单吧,通常的交易记录可以是这样的:

付款方

收款方

金额

申龙斌

凉皮店老板

5

然而,在比特币的区块链里,为了避免双重支付、支持去中心化、挖矿发行货币等,采用了一种完全不同的格式来记录这些交易,通过矿工把这些交易打包并发布在区块链上,它是按币的来源vin和去处vout(或使用条件)来记录的,大概是这样的(注意这是极度简化的常规交易):

输入vin

输出vout

来源于以前的某笔交易的某项输出

支付的币数1,使用条件1找零币数2,使用条件2

一笔真实的交易例子

为了对交易细节有更直观的概念,我用一次在区块468779中的一笔真实交易作为例子来说明交易中的发币方、收币方、发币数量是如何得到的。

我在区块链生存训练中教大家使用钱包发币、收币时,给地址1KWTsVew7zEVGg6nq8j3GtYkPYnyu99Yzd 发送了2次0.001 BTC。在浏览器中输入这个网址(图a): http://blockchain.info/address/1KWTsVew7zEVGg6nq8j3GtYkPYnyu99Yzd

1620

图a 两笔收款记录

可以看到这个地址共有两笔0.001 BTC的收款交易,点击第一笔交易中那个4b77...3818那串长长的字符串(TXID,即交易ID,占32个字节),可以看到这笔交易的详细信息(图b)。

1620

图b 交易的详细信息

浏览器中显示的许多内容都已经转换成了方便大家阅读的信息,在实际的记录中并不是这样存储的,而是分为两个部分:输入vin输出vout

可以使用Bitcoin Core软件带的命令getrawtransaction来查看这笔交易的内部细节,请先确保Bitcoin Core已经完成了全部数据的同步,在“帮助”菜单中点击“调试窗口”,然后再点击“控制台”,在底部输入命令:

getrawtransaction 4b77cb17105a61dc6ca0bfa535fd3df69bfd5b65d8123e067aa4953e169b3818 true

忽略其它信息,把目光注意到vin和vout两部分。

"vin": 
[{
    "txid": "2f072845185e5eef86631ed9afa08ae32a9880f634e8806a2625308eabe7fa5f",
    "vout": 1,
    "scriptSig": {
        "asm": "3045022100c3d39df2a31f7a5df7b1a44144dfc73089cb628d888d53dc27a12f2225810c0902204204e40bafd9a9db0e4e416f099ff3c05223c99b77abd2b5622ded4e4f72498f[ALL] 0304ea538bb0aaace649751a98659d6ac7e55dae01707215164a578a408913cf91",
        "hex": "483045022100c3d39df2a31f7a5df7b1a44144dfc73089cb628d888d53dc27a12f2225810c0902204204e40bafd9a9db0e4e416f099ff3c05223c99b77abd2b5622ded4e4f72498f01210304ea538bb0aaace649751a98659d6ac7e55dae01707215164a578a408913cf91"
        },
    "sequence": 4294967294
}]
"vout": 
[
    { "value": 0.98422648,
      "n": 0,
      "scriptPubKey": {
           "asm": "OP_DUP OP_HASH160 6a263f895ad9890653e8523d3bfb2823fa4ee96a OP_EQUALVERIFY OP_CHECKSIG",
           "hex": "76a9146a263f895ad9890653e8523d3bfb2823fa4ee96a88ac",
           "reqSigs": 1,
           "type": "pubkeyhash",
           "addresses": ["1AgGSsAHVQEzaJq1GBDh54U55ECq6VWrLT"]
       }
    },
    { "value": 0.00100000,
      "n": 1,
      "scriptPubKey": {
           "asm": "OP_DUP OP_HASH160 cb04c1e7561fdb85f6360f9c3992ef41fd71d89f OP_EQUALVERIFY OP_CHECKSIG",
           "hex": "76a914cb04c1e7561fdb85f6360f9c3992ef41fd71d89f88ac",
           "reqSigs": 1,
           "type": "pubkeyhash",
           "addresses": ["1KWTsVew7zEVGg6nq8j3GtYkPYnyu99Yzd"]
       }
    }
 ]

发送方地址和金额

先来看看图b左侧的这个比特币地址(1EXH329ttyGjoD5SS52hrbgTHWmkXAQGmT)是如何得到的。

比特币系统中规定:vin一定是来自于以前的某笔交易的vout,这样一笔一笔交易形成一个链条,一直连到创币交易coinbase

看vin的内容,txid是2f072845185e5eef86631ed9afa08ae32a9880f634e8806a2625308eabe7fa5f,vout是1,表示这笔资金来源于交易ID为2f07...e7fa的第1项输出。

1620

图c 交易的内部结构

在浏览器中输入 http://blockchain.info/zh-cn/tx/2f072845185e5eef86631ed9afa08ae32a9880f634e8806a2625308eabe7fa5f

1620

图d 找到前面的某笔交易vout

可以查到这条交易在区块468330中,vout是从0开始编号的,找到vout 1,可以看到比特币地址,正是"1EXH329ttyGjoD5SS52hrbgTHWmkXAQGmT",金额是98595146。

这里有个细节先不展开了,在交易记录中并不是记录以1开头的比特币地址,而是记录着下面这个内容:

OP_DUP OP_HASH160 94537fce4457242f0ac10343695d723a64d2fa9e OP_EQUALVERIFY OP_CHECKSIG

地址1EXH329ttyGjoD5SS52hrbgTHWmkXAQGmT 实际上是公钥94537fce4457242f0ac10343695d723a64d2fa9e的Base58check表示法。

接收方地址和金额

图b中的发送方地址找到了,再来看接收方的信息,这时候看vout的内容。

"vout": 
[
    { "value": 0.98422648,
      "n": 0,
      "scriptPubKey": {
           "addresses": ["1AgGSsAHVQEzaJq1GBDh54U55ECq6VWrLT"]
       }
    },
    { "value": 0.00100000,
      "n": 1,
      "scriptPubKey": {
           "addresses": ["1KWTsVew7zEVGg6nq8j3GtYkPYnyu99Yzd"]
       }
    }
 ]

这里面有两项,后面那项的value是金额:100000聪,是收款金额,地址是“1KWTsVew7zEVGg6nq8j3GtYkPYnyu99Yzd”;前面那个vout 0的金额是98422648,是找零金额,地址是"1AgGSsAHVQEzaJq1GBDh54U55ECq6VWrLT"。

交易费

交易费并没有直接记录在交易里,而是通过一个公式计算出来的:

    交易费 = sum(vin) - sum(vout)

上面的例子里vin的金额是98595146,vout里是98422648+100000,所以

交易费 = 98595146 - (98422648 + 100000) 
      = 72498

正好就是图b右侧的交易费的数字,注意这里用"聪"为单位,浏览器里显示的单位是BTC。

脚本

再重复一遍,vin要指向以前交易的vout,那么我是不是能够把vin指向别人的vout?去花别人的BTC?当然不能,在vout里有一个scriptPubKey,称为锁定脚本(Locking Script)或见证脚本(Witness Script),表示要满足一定条件才可以花掉这些钱。(这里出现了见证Witness这个概念,以后理解"隔离见证"就会容易一些了)

而vin里面有一个scriptSig,称为解锁脚本(Unlocking Script),通常里面记录着所有人的签名。只有解锁脚本与锁定脚本匹配时,这笔交易才是有效的。

小结:

  • 交易里主要记录着输入vin和输出vout
  • 输入vin来自于以前一笔交易的vout
  • vout里通常有一个找零地址和找零金额
  • 交易费 = sum(vin) - sum(vout)
  • vout里记录着锁定脚本
  • vin里记录着解锁脚本,通常是一个签名

--- END ---



原文发布时间为:2017-08-04
本文作者:申龙斌
本文来源:腾讯云 云+社区,如需转载请联系原作者。

目录
相关文章
|
2月前
|
存储 供应链 安全
【区块链】智能交易模式下的数据安全流通模型
【区块链】智能交易模式下的数据安全流通模型
90 1
|
5天前
|
数据可视化 数据挖掘 区块链
《区块链公链数据分析简易速速上手小册》第4章:交易数据分析(2024 最新版)(上)
《区块链公链数据分析简易速速上手小册》第4章:交易数据分析(2024 最新版)(上)
32 0
|
9月前
|
供应链 安全 区块链
【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)
【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)
|
11月前
|
区块链
区块链101:区块链交易是如何运作的?
区块链101:区块链交易是如何运作的?
|
安全 算法 区块链
区块链金融交易借贷平台开发技术实现去中心化
传统的金融交易清算周期长和成本高昂,引入区块链技术,能够加快传统金融交易中心化的交易缓慢和低效的后端运作,并且重塑交易和结算流程。一个共享的数字公开账本能够持续被维护,确认所有参与链上的交易,防止欺诈,对全球金融交易、清算和结算带来了一个重大的改观机会。
|
存储 机器学习/深度学习 人工智能
【源码亲测演示】火币虚拟币交易平台币币交易区块链虚拟
花火交易所搭建 合作搭建交易所 仿28交易所搭建 如何搭建货币交易所 交易所源码搭建教程 怎么搭建usdt交易所 交易所搭建数字货币 杭州交易所搭建源码 搭建交易所教程 合约交易所如何搭建 交易所和平台搭建 怎么搭建交易所
【源码亲测演示】火币虚拟币交易平台币币交易区块链虚拟
|
存储 供应链 安全
景蓝交易所源码php区块链交易所源码/币币/法币/合约交易/配资上币/带搭建教程
景蓝交易所源码php区块链交易所源码/币币/法币/合约交易/配资上币/带搭建教程
景蓝交易所源码php区块链交易所源码/币币/法币/合约交易/配资上币/带搭建教程
|
安全 区块链 数据安全/隐私保护
交易所源码购买数字货币量化交易平台 区块链项目源码 交易系统源码 币币交易源码 区块链游戏源码 火币交易所源码 交易系统源码
去中心化交易所开发 币严交易所搭建 数字货币交易所系统开发 开发一个交易所需要多久 交易所系统开发搭建 合约交易所系统搭建开发 区块链交易所如何搭建 交易所系统搭建 如何搭建一个区块链数字货币交易所系统 区块链搭建交易所 开发交易所交易系统 数字货币区块链交易所系统搭建方案  数字货币交易所源码 数字货币源码 合约交易所源码
|
8月前
|
存储 安全 区块链
区块链游戏系统开发(开发详细)/案例开发/设计功能/逻辑方案/源码平台
  区块链游戏系统开发是一个复杂而精密的过程。首先,需要进行需求分析和规划,确定游戏系统的功能和特性。然后,进行技术选型和架构设计,选择适合的区块链平台和开发工具。接下来,进行系统的搭建和编码,实现游戏逻辑和用户交互功能。最后,进行测试和优化,确保系统的稳定性和性能。
|
8月前
|
安全 Go 区块链
区块链游戏链游系统开发功能详情丨方案逻辑丨开发项目丨案例分析丨源码规则
 In recent years, with the continuous development of blockchain technology, NFTs (non homogeneous tokens) and DAPPs (decentralized applications) have emerged in the gaming industry.

热门文章

最新文章