比特币交易构成(二)

转自:http://618.io/2013/10/27/bitcoin-transaction-02/

交易的构造、签名与广播

上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。

普通交易

1. 找出未花费的币(unspent output)

通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。

执行:


1

bitcoind listunspent 0 100 ‘["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]‘

输出:


1

2

3

4

5

6

7

8

9

10

11


[

{

"txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",

"vout" : 0,

"address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",

"account" : "",

"scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",

"amount" : 0.19900000,

"confirmations" : 1

}

]

我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。

2. 创建待发送交易

创建待发送交易,由命令:createrawtransaction [{"txid":txid,"vout":n},...] {address:amount,...}来完成。我们将 0.1BTC发送至 1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x ,并支付 0.0001 BTC做为矿工费。输入交易的额度为 0.199 ,输出为 0.1 + 0.0001 = 0.1001 ,那么还剩余: 0.199 - 0.1001 = 0.0989 ,将此作为找零发回给自己。

执行:


1

2

3


bitcoind createrawtransaction \

‘[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]‘ \

‘{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}‘

输出:


1

010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000

通过命令:decoderawtransaction <hex string>,可以将此段十六进制字符串解码。

执行:


1

bitcoind decoderawtransaction ‘010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000‘

输出:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44


{

"txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",

"version" : 1,

"locktime" : 0,

"vin" : [

{

"txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",

"vout" : 0,

"scriptSig" : {

"asm" : "",

"hex" : ""

},

"sequence" : 4294967295

}

],

"vout" : [

{

"value" : 0.10000000,

"n" : 0,

"scriptPubKey" : {

"asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",

"hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",

"reqSigs" : 1,

"type" : "pubkeyhash",

"addresses" : [

"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"

]

}

},

{

"value" : 0.09890000,

"n" : 1,

"scriptPubKey" : {

"asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",

"hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",

"reqSigs" : 1,

"type" : "pubkeyhash",

"addresses" : [

"1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"

]

}

}

]

}

至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。

在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用

3. 签名

交易签名使用命令:


1

2

3


signrawtransaction <hex string> \

[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [<privatekey1>,...] \

[sighashtype="ALL"]

  • 第一个参数是创建的待签名交易的十六进制字符串;
  • 第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript
  • 第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
  • 最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;

签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction <txid> [verbose=0]完成。

执行:


1

bitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1

输出:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36


{

"hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",

"txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",

"version" : 1,

"locktime" : 0,

"vin" : [

{

"txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",

"vout" : 0,

"scriptSig" : {

"asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",

"hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"

},

"sequence" : 4294967295

}

],

"vout" : [

{

"value" : 0.19900000,

"n" : 0,

"scriptPubKey" : {

"asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",

"hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",

"reqSigs" : 1,

"type" : "pubkeyhash",

"addresses" : [

"1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"

]

}

}

],

"blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",

"confirmations" : 19,

"time" : 1383235737,

"blocktime" : 1383235737

}

scriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。

签名使用ECDSA算法,对其,“空白交易”签名之,执行:


1

2

3


bitcoind signrawtransaction \

"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \

‘[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]‘

输出:


1

2

3

4


{

"hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",

"complete" : true

}

签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction <hex string>解码查看之。

最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction <hex string>来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx

执行:


1

2


bitcoind sendrawtransaction \

"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"

输出:


1

b5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d

返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。

合成地址交易

合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:


1

m {pubkey}...{pubkey} n OP_CHECKMULTISIG

M和N需满足:

  • 1<=N<=3
  • 1<=M<=N

可以是1 of 11 of 22 of 3等组合,通常选择N=3

  • 1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;
  • 2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;
  • 3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;

合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.

首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。


1

2

3

4

5

6


# No.1

0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU

# No.2

04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk

# No.3

048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw

使用命令:createmultisig <nrequired> <‘["key","key"]‘>来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.

输入:


1

2


bitcoind createmultisig 2 \

‘["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]‘

输出:


1

2

3

4


{

"address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",

"redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"

}

得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。

时间: 2024-10-10 20:37:14

比特币交易构成(二)的相关文章

比特币交易渠道暂停、严管、死亡之后,币圈进入强运营时代

币安首页,"用户突破600万"的banner十分醒目.600万用户貌似不多,但如果这600万用户中97%为国外用户,来自全球180多个国家呢?是不是厉害! 一.币安崛起是币币交易模式的胜利 2017年7月14日币安正式上线.2017年12月8号,币安对外宣布,注册用户正式突破100万,2017年12月15号,币安用户突破150万,2018年1月10日,币安宣布用户数突破500万--如今币安用户已经超过600万,并以每天25万新用户的速度递增. 火爆的不只是用户数据,经过半年的运营,币安

【WebSocket】---实现定时推送比特币交易信息

实现定时推送比特币交易信息 实现功能:跟虚拟币交易所一样,时时更新当前比特币的价格,最高价,最低价,买一价等等...... 提示:(1)本篇博客是在上一遍基础上搭建,上一篇博客地址:[WebSocket]---实现游戏公告功能. (2)相关源码会在其它有关websocket案例写完,写在gitHub上,后期会贴上地址. 先看效果演示 当前的信息就是虚拟币交易所最新BTC的数据信息. 我们看到每隔1秒都会更新一次最新的比特币当前信息.(截止到我发这篇博客时,比特币当前价格:6473美元左右) 一.

BitcoinJS - 支持比特币交易的 JavaScript 库

BitcoinJS 是一个干净,可读的 JavaScript 开发库,用于比特币交易.支持 Node.js 平台和浏览器端.已有超过150万的钱包用户在使用, BitcoinJS 是几乎所有的 Web 端比特币钱包交易最重要的库.它支持先进的功能,如多SIG ,速度快以及优化的代码. 官方网站 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊讶的 CSS3 动画效果演示 十分惊艳的8个 HTML5 & JavaScript 特效 Web 开发中很实用的1

JavaScript编写自己的比特币交易代码

今天我们将编写第一个比特币交易代码.为了实现这一目标,我们将使用名为bitcore的JavaScript库.JavaScript是最流行的现代编程语言,几乎每个开发人员都知道它,因此它使这篇文章具有普遍性并且对更广泛的受众有用. 在继续阅读本文之前,你应该至少掌握有关比特币区块链如何工作的基本技术知识.如果没有,请花几分钟时间阅读区块链简介.如果你有更多的时间,比如几个小时,我建议你阅读掌握比特币. 让我们从一个具有以下依赖关系的新NPM项目开始: [...] "dependencies&quo

AI量化交易(二)——Tushare财经数据框架

AI量化交易(二)--Tushare财经数据框架 一.Tushare简介 1.Tushare简介 Tushare是一个免费.开源的python财经数据接口包,目前为Tushare Pro版本,主要实现对股票等金融数据从数据采集.清洗加工到数据存储的过程,能够为金融分析人员提供快速.整洁和多样的便于分析的数据.Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas.NumPy.Matplotlib进行数据分析和可视化. 2.Tushare安装 Git

比特币交易构成(一)

转自:http://618.io/2013/10/27/bitcoin-transaction-01/ 简介 交易(Transaction)是比特币系统的信息载体,最小单元.而块(Block)就是将这些基础单元打包装箱,贴上封条,并串联起来.巨大算力保障了块的安全,也就保障了单个交易的安全. 类型 交易有三种常见类型:产量交易(Generation),合成地址交易(Script Hash),通用地址交易(Pubkey Hash).该分类并非严格意义的,只是根据交易的输入输出做的简单区分. Gen

比特币交易的脚本是如何执行的

在学习UTXO中,一笔UTXO包含了一个解锁脚本(pkScript),花费这一笔UTXO时,需要通过该脚本验证,才能够花费这笔UTXO. 如何拥有一个UTXO的使用权 比特币的交易创建的输出并非一个简单的公钥地址,而是一个脚本.如果B给A转账0.5个btc的交易中,其实输出pkScript脚本类似: OP_DUP OP_HASH160 abcd1234...9876 OP_EQUALVERIFY OP_CHECKSIG 其中abcd1234...9876为A的公钥哈希,其他为指令.当谁能提供一个

高频交易(二)浅谈高频交易中比较成熟的一些交易策略

https://blog.csdn.net/jambeau/article/details/87715761 今天我们谈谈高频交易中比较成熟的一些交易策略,应用于数字货币市场. 引言:高频交易是自动化交易的一种形式,以速度见长,利用计算机系统加入人工智能算法,以智能化方式,快速,稳健的短线持仓执行交易.其中,国际金融领域比较流行的交易策略有:1.市场微观结构交易策略:2.统计套利策略:3.事件交易策略:4.流动性交易策略. 高频交易是量化投资领域,金融市场一颗璀璨的明星,是金融科技发展到一定程度

《Nodejs开发加密货币》之二十一:交易

题外话:这篇文章,耗费了我大量精力,用UML表达javascript类及流程本来就不是什么容易的事情,用来描述加密货币交易这种验证逻辑非常多的代码更难,加之Nodejs的回调在这些代码里嵌套很深,所以如何把异步调用变成人类容易理解的顺序调用,也做了一番取舍,时间不知不觉就过了一星期. 所幸,赶在比特币减半的今天完成并发布这篇文章,也算在区块链火热的今天,<Nodejs开发加密货币>走到了一个关键节点:触及了加密货币的灵魂和腹地.动辄几千一枚的比特币等加密货币可能会消亡,但是背后的技术却蓬勃发展