比特币交易(Transaction)的输入与输出

摘要:
具体来说,它是货币交易的数字签名链。交易列表的数据如下:In:f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6索引:
比特币通过“挖矿”机制保证了不能任意造币。通过分布式网络和HashCash机制解决双重支付问题。事实上比特币系统中不存在独立的电子货币,而只存在交易单(账单),货币值是依附于交易单存在的,所以比特币中的电子货币实质上交易的账单记录的变化,确切的说是货币交易(Transactions)的 数字签名链,它的数字签名算法使用的是ECDSA(椭圆曲线数字签名算法 secp256k1曲线)进行签名的。
 

比特币交易(Transaction)的输入与输出第1张

 
 交易单的数据如下:
In:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd0
4470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446
618c4571d1090db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fd
d7d5d6cc8d25c6b241501
 
Out:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35
549d OP_EQUALVERIFY OP_CHECKSIG
 
交易单记录的是本次交易的收入来源(in)和支出(out)。当你支出(给)一笔钱的时候,首先在交易单中就要描述清楚你要支出(out)的钱的收入来源 (in),然后在支出(out)项中,指明要支出的金额,以及通过脚本的形式写明接收者的公钥,然后用自己的私钥签名(scriptSig)认可该笔交 易,最后将交易单广播到网络。
 
收入来源(in):
Previous tx: 为收入来源交易单的散列值,也就是待支付的钱是谁给你的,经常会有多个收入来源被列在交易单中
index: 指明是收入来源交易单中具体哪一个out,也就是Previous tx交易单中的out索引值(因为out也可以有多个)。
scriptSig: 拥有者对该交易的ECDSA签名认可。
 
接收对象(out):
Value: 发送的币值,以Satoshi 为单位,1BTC = 100,000,000 Satoshi
scriptPubKey: 接收方的公钥脚本。
 
in与out的关系:
每一笔交易,out的总额应该等于in的总额。但是,在这个交易单里,只会有out的Value,没有in的Value,而是通过in的Pervious与index,追溯到上一个交易单的某一个out,获得Value。
一次send bitcoin,剩下的钱,应该out给自己,否则这个钱就丢了。
 
情况列举:
我有10个BTC,是某一次交易获得的,我要送给朋友A,10个BTC。这时候,有一个in,一个out。
我有10个BTC,是某一次交易获得的,我要送给朋友A,5个BTC,这时候,有一个in,两个out,一个指向朋友5个BTC,一个指向我自己,得到剩下的5个BTC。
我有10个BTC,是以前的两次交易获得的,我要送给朋友A,10个BTC,这时候,有两个in,一个out。
我有10个BTC,是以前的两次交易获得的,其中一次获得了6个BTC,另一次获得了4个BTC,我要送给我的朋友7个BTC,这时候,有两个in,两个out。
 

比特币交易(Transaction)的输入与输出第2张

/
// An input of a transaction.  It contains the location of the previous
// transaction's output that it claims and a signature that matches the
// output's public key.
//
class CTxIn
{
public:
    COutPoint prevout;
    CScript scriptSig;
    unsigned int nSequence;
    ....
}
 
//
// An output of a transaction.  It contains the public key that the next input
// must be able to sign with to claim it.
//
class CTxOut
{
public:
    int64 nValue;
    CScript scriptPubKey;
    ....
}
 
//
// The basic transaction that is broadcasted on the network and contained in
// blocks.  A transaction can contain multiple inputs and outputs.
//
class CTransaction
{
public:
    int nVersion;
    std::vector vin;
    std::vector vout;
    unsigned int nLockTime;
 
    ....
 
每一笔交易单验证追查到最后,第一笔总是“挖矿”所得,这被称为coinbase
 如果是第一次“挖矿”所得,电子货币的内容用JSON格式表示如下:
{
  "hash":"b3141455cb397e42665b90b3726c4770fd36101715618718111403bc780ceaa2",
  "ver":1,
  "vin_sz":1,
  "vout_sz":1,
  "lock_time":0,
  "size":135,
  "in":[
    {
      "prev_out":{
        "hash":"0000000000000000000000000000000000000000000000000000000000000000",
        "n":4294967295
      },
      "coinbase":"042194261a02f200"
    }
  ],
  "out":[
    {
      "value":"50.01000000",
      "scriptPubKey":"0452d1a02ffeacfc0c78fcf2ceeaf04d5416c15af1c65da13d9cdaa56844c825c1aa2f540e9439b f38a43419002d8441eea627cb56d6ed51e7848da5c3f6eee6ec OP_CHECKSIG"
    }
  ]
}
 
每一笔交易都会向整个P2P网络广播该货币的交易记录。通过投票机制,来决定该支付交易是否正常。如节点认为该交易记录是正常的那么就通过CPU计算 POW(Proof-of-Work),然后广播,其它节点收到这个POW可以继续投票,形成Block 链(见挖矿)。如果节点收到不一致的两个交易记录,那么只信任链最长的。如果一笔Bitcoin被支出两次的情况广播出来,那么某些节点将先看到它第一次 发生的支付交易,其他节点则看到的是它第二次发生的支付交易。究竟是哪一个支付交易“赢”了,则是由恰好创建了下一个block的那个节点来决定 —— 无论是哪个节点找到了“小的散列值”, 它的block中包含的那个支付交易被判断为有效的,其他的支付交易被视为无效。

免责声明:文章转载自《比特币交易(Transaction)的输入与输出》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇把VS Code打造成Java开发IDE详解SpringBoot应用跨域访问解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

003-docker命令-镜像 images:search、pull、rmi、tag、远程镜像仓库命令,本地镜像管理命令

1、远程镜像仓库 docker login/logout:查看 【不常用】 docker push:查看 【不常用】 docker search:从Docker Hub查找镜像   语法:docker search [OPTIONS] TERM   OPTIONS说明: --automated :只列出 automated build类型的镜像; --n...

node.js版本管理

Node安装Node的安装需要依赖很多,如gcc等,首先我们需要将这些安装成功,用rpm命令查看下,果然我们并没有gcc等,所以要用yum进行安装(基于centos6.9版本): yum -y install gcc gcc-c++ kernel-devel 将依赖安装后,我们就可以进行Node的安装啦(我是直接安在了root目录下):来到安在目录 wge...

MongoDB安装与配置(Ubuntu)

安装 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/ 1、Import the public key used by the package management system wget -qO - https://www.mongodb.org/static/pgp/...

IOS-基础知识

1 变量声明 变量的声明与C语言一样,在变量名前加类型名 以下这些数据类型是从C语言中直接拿来使用的: int n; unsigned int n; char n; unsigned char n; long n; float n; double n; 另外,Objective-C还扩展了一些数据类型,布尔类型用YES和NO来表示逻辑1和逻辑0...

Lanproxy 遍历目录漏洞 CVE-2021-3019 附批量POC

一、概述 Lanproxy内网穿透工具,支持tcp流量转发,可支持任何tcp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面等等)今天给大家带来的是 Lanproxy 遍历漏洞 (CVE-2021-3019)通过../绕过读取任意文件。 该漏洞允许读取/../conf/config.properties来获取到内部网连接的账户密码。 二、漏洞...

Jmeter系列(27)- 详解正则提取器

如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html   有了 JSON 提取器为啥还要用正则提取器? JSON 提取器只针对接口返回的响应内容 如果想提取的是响应头、请求头的值,而非响应内容的值呢? 这个时候正则提取器的作用就出来了,它可以提取请...