快捷导航

比特币区块链开发由浅入深指南(四):实战多重签名交易

[复制链接]
查看: 19|回复: 0
发表于 2018-9-14 21:21:21 | 显示全部楼层 |阅读模式
本文以比特币测试网络(bitcoin-testnet)作为开发实验环境,以结合Node.js完成PPkPub开源项目ODIN的标识注册功用作为详细使用案例,来阐明如何应用多重签名买卖方式来嵌入自定义数据并签名后播送,再被矿工节点确认存入区块链后,最终能被读取解析失掉注册后果,这样就完成了一个从写入区块链到从区块链读取的完好进程。
       
       

5b2c70ceee5f4.jpg

5b2c70ceee5f4.jpg


       
        一、理解ODIN开放标识的定义
               ODIN 作为PPkPub 开放小组发布的第一个开源项目,是Open Data Index Name 即“开放数据索引命名标识”的缩写。狭义上,ODIN 是指在网络环境下标识和交流数据内容索引的一种开放性零碎,它服从URI(一致资源标识符)
标准,并为基于数字加密货币区块链(BlockChain)的自主开放、 平安可信的数据内容管理和知识产权管理提供了一个可扩展的框架。它包括4
个组成要素:标识符、 解析零碎、 元数据和规则(Policies) 。 广义上,ODIN 是目标识任何数据内容对象的一种永世性开放标识符。
       

5b2c6fd61b9cf.png

5b2c6fd61b9cf.png


               ODIN 可以被抽象天文解为“数据时代的自主域名”,是基于比特币区块链定义并可扩展兼容更多区块链的完全开放、 去中心化的命名标识体系,相比传统的 DNS 域名拥有更多创新特性,可以很好地被使用到大数据、智能设备和物联网等新兴范畴。
               参考了XCP(合约币)和Mastercoin(万事达币)等数字加密货币的技术原理,ODIN的完成是经过将特定音讯数据按比特币协议标准停止特定编码后,作为比特币买卖播送到比特币网络上存入区块链。
        每个ODIN信息包括以下特性:
(a) 一个比特币源地址(对应ODIN音讯生成者)
        (b) 一个比特币目的地址(对应受ODIN音讯指向的目的集体,当音讯生成者与受音讯指向的目的集体相反时,该地址为空)
        (c) 若干个1-of-N多重签名输入比特币地址公钥(经由ODIN数据包编码生成,实践生成买卖时从ODIN设置数据中按顺序每提取32个字节,并在该32个字节的前部加上1个字节对应该字符串的长度值,总共33个字节对应一个比特币公钥,最初缺乏33个字节的自动在尾部追加二进制0填满直到正好到达33字节对应一个紧缩公钥)
        (d) 比特币源地址中有一定数量的比特币余额(建议有0.001BTC以上,用于生成从源地址发送到目的地址的若干无效买卖条目以嵌入ODIN数据包。注: 由于比特币1-of-N多重签名买卖的特点,这些比特币金额不会发作实践收入,将在下一个ODIN音讯中被回收循环应用)
        (e) 以比特币计的音讯本钱固定费用(缺省是0.0001 BTC),将领取给收录这个买卖数据块的比特币网络矿工。
        (f) 一个比特币找零地址(与上述第一项的比特币源地址相反,用于依照比特币买卖协议将输出买卖的比特币金额在生成若干条满足嵌入ODIN数据包的买卖条目后多出的金额回收到音讯发送者账户)
        上述的特性(c)是技术完成的关键,ODIN数据块会嵌入到比特币买卖的多重签名输入数据块中,是1-of-N输入,每个数据块的第一个公钥固定是发送者的,因此输入的币值可以赎回循环运用,存贮第二个到第N个公钥的地址空间用来存贮编码的ODIN音讯数据。关于比特币多重签名买卖的详细阐明请参考比特币协议标准。
注:N建议取值不超越10。关于1条1-of-10多重签名输入仍无法包容的ODIN数据块,可依样扩展存入第2条,第3条等更多条多重签名输入记载中即可。
        每个ODIN信息数据块的格式按字节顺序定义如下:
        第1-32字节 : 前缀特征标识,32个字节的ASCII字符串”P2P is future! ppkpub.org->ppk:0″(不含两侧的双引号)
        第33字节 : 音讯类型,1个字节。
        第34字节到音讯完毕为按音讯类型区分的不同音讯数据,详见详细的ODIN 音讯类型中的定义。
        注:为了便于辨认,每个ODIN音讯都以32字节的ASCII字符串”P2P is future! ppkpub.org->ppk:0″(不含两侧的引号)作为前缀特征标识,这个字符串十分长,因此不能够把ODIN的特定买卖和其它的比特币买卖搞混。
       
        二、将ODIN标识注册到区块链上的实例解析
        下文是ODIN协议里关于“新注册ODIN标识”的详细音讯定义:
————————————————————————————————————
新注册ODIN标识
        比特币源地址:对应ODIN标识注册者
比特币目的地址:对应ODIN标识拥有者
        音讯数据块的格式按字节顺序定义如下:
第1-32字节 : 前缀特征标识,32个字节的ASCII字符串”P2P is future! ppkpub.org->ppk:0″(不含两侧的双引号)
第33字节 : 音讯类型,1个字节,取值为ASCII字符R
第34字节 : 音讯注释数据格式,1个字节。
    取值定义:ASCII字符,
       T 表示“UTF-8编码文本字符串”,
       G 表示“经gzip算法紧缩失掉的二进制数据,需解压后可失掉UTF-8编码的原始文本字符串”
第35-36字节: 音讯注释数据字节长度,2个字节的无符号短整型二进制数据,取值范围为0-65535。
第37字节到音讯注释指定长度完毕是按字节寄存的音讯注释数据,需依据第34字节的数据格式取值来取得原始音讯文本,为UTF-8编码的JSON格式字符串,对应一个JSON对象数据,阐明如下:
  {
   ”title”:”阐明:集体称号字符串”,
   ”email”:”阐明:集体的地下EMAIL,可选”,
   ”auth”:”阐明:配置权限,取值定义见下方正文”,
   ”ap_list”:["阐明:若干个数据拜访点AP的URL数组,最少需填写一个",...,"xxxx"],
   ”catalog”:”阐明:数据源类型,可选保存字段,待补充”
  }
        注:配置权限的取值阐明:ASCII字符0,1或2
0表示“注册者或拥有者任一方都可以修正拥有者相关信息”,
1表示“只要注册者能修正拥有者相关信息”,
2表示“注册者和拥有者必需共同确认才干修正拥有者相关信息”,
        ————————————————————————————————————
        假定有下述示例的一段ODIN标识注册信息:
{“title”:”PPk-ODIN-sample”,”email”:”[email protected]”,”auth”:”2″,”ap_list”:["http://ppkpub.org/AP/"]}
        那么就可以依照上述的音讯定义将其组装为一条比特币买卖记载以播送到比特币网络上失效,对应买卖的原始数据示例如下(将原始二进制数据按字节以16进制ASCII码方式输入,便于剖析):
01000000032237b858f1a697cc2d26a451bd3fd3ef1944eb53f579b4fac38e5ecb5c0fc42c010000006b483045022100da55
a2d9f97695db12aecc0113662437957a6d4f17064ff49602ddc39904c31302201e81eae0c84f25019485ae4a2ce9b67c0e84
85599df87ab876b469e3cbbd24100121022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9ff
ffffff2ef89686bebf72bd31b8f27780223f7b5f448d0110b6fdda19595a073f42a301000000006b483045022100d49360fa
6bd45b92a068127db31c9cfd93af87543799968a5b076c2fea151f9b0220647900f5fc763f5a3eed13d382e13a3bddd15646
867b56f1be9d2629b2ccb4360121022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9ffffff
ffd704b1c1977cd50be182134b18fafaa16db1e917dfe4f93bcab1584aabf323d4010000006b483045022100fb88f75cae8a
ccfe969cd89afbca677ff78a4914f5f506d6e5d481baf484e9f2022039f560414ec5a778a19565f7fe9e51b6acf7b841b4ba
2188785a5bb6051d7d510121022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9ffffffff03
7d160000000000001976a91451a09d25106715f09a14cac6367c3f4f2408590d88ac7d16000000000000cf5121022e9f3129
2873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9212050325020697320667574757265212070706b7075
622e6f72672d3e70706b3a302120525400657b227469746c65223a2250506b2d4f44494e2d73616d706c65222c222120656d
61696c223a2270706b70756240676d61696c2e636f6d222c22617574682221203a2232222c2261705f6c697374223a5b2268
7474703a2f2f70706b7075622e6f210972672f41502f225d7d000000000000000000000000000000000000000000000056ae
e6cac223000000001976a914391ef5239da2a3904cda1fd995fb7c4377487ea988ac00000000
对上述报文按协议规则可按字段分讲解明如下:
        01000000     // 版本号,UINT32
        03        // Tx输出数量,变长INT。0×03=3个输出。
        /*** 接上去是第一组Input Tx ***/
2237b858f1a697cc2d26a451bd3fd3ef1944eb53f579b4fac38e5ecb5c0fc42c  // Tx买卖的Hash值,固定32字节
01000000     // 消费的Tx位于前向买卖输入的第0个,UINT32,固定4字节
6b        // 接上去对应签名数据的长度, 0x6b = 107字节 。
         // 这107字节长度的签名,含有两个局部:私钥签名 + 公钥。
         // 当这里的数值为00时,则表示为尚未经过签名的原始买卖
48        // 对应私钥签名的数据长度,0×48 = 72字节
3045022100da55a2d9f97695db12aecc0113662437957a6d4f17064ff49602ddc39904c31302201e
81eae0c84f25019485ae4a2ce9b67c0e8485599df87ab876b469e3cbbd241001  //私钥签名内容
21        // 对应公钥的数据长度,0×21 = 33字节
022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9  //对应公钥数据
ffffffff     // 序列号,UINT32, 固定4字节。该字段是目前未被运用的买卖交换功用,默许都设成0xFFFFFFFF
        /*** 第二组Input Tx。与上同理,省略分解 ***/
2ef89686bebf72bd31b8f27780223f7b5f448d0110b6fdda19595a073f42a301000000006b483045
022100d49360fa6bd45b92a068127db31c9cfd93af87543799968a5b076c2fea151f9b0220647900
f5fc763f5a3eed13d382e13a3bddd15646867b56f1be9d2629b2ccb4360121022e9f31292873eee4
95ca9744fc410343ff373622cca60d3a4c926e58716114b9ffffffff
        /*** 第三组Input Tx。与上同理,省略分解 ***/
d704b1c1977cd50be182134b18fafaa16db1e917dfe4f93bcab1584aabf323d4010000006b483045
022100fb88f75cae8accfe969cd89afbca677ff78a4914f5f506d6e5d481baf484e9f2022039f560
414ec5a778a19565f7fe9e51b6acf7b841b4ba2188785a5bb6051d7d510121022e9f31292873eee4
95ca9744fc410343ff373622cca60d3a4c926e58716114b9ffffffff
03        // Tx输入买卖数量,变长INT类型。0×03=3个输入。
        /*** 第一组输入 ***/
7d16000000000000 //输入的比特币数量,UINT64,8个字节。字节序需翻转失掉0x000000000000167d = 5757 satoshi = 0.00005757 BTC
19        //输入描绘脚本字节数, 0×19 = 25字节,由一些操作码与数值构成
76        //脚本起始操作 0×76 代表 OP_DUP(复制栈顶元素)
a9        //地址类型 0xa9 代表 OP_HASH160(栈顶项停止两次HASH,先用SHA-256,再用RIPEMD-160)
14        //地址长度 0×14 = 20字节
51a09d25106715f09a14cac6367c3f4f2408590d  //对应ODIN标识拥有者地址的HASH160值,20字节
88        //0×88 代表 OP_EQUALVERIFY (运转脚本的二进制算术和条件,如后果为0,之后运转OP_VERIFY)
ac        //Oxac 代表 OP_CHECKSIG (买卖所用的签名必需是哈希值和公钥的无效签名,假如为真,则前往1)
        /*** 第二组输入 ***/
7d16000000000000 //输入的比特币数量,UINT64,8个字节。字节序需翻转,
cf        //输入描绘脚本字节数, 0xcf = 207字节,由一些操作码与数值构成
51        //Ox51代表OP_1(将脚本代码1压入堆栈)
21        //压入堆栈的第1个公钥的数据长度,0×21 = 33字节。对应ODIN标识注册者地址的公钥
022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9
21        //压入堆栈的第2个公钥的数据长度。从第2个公钥开端嵌入ODIN标识音讯内容
2050325020697320667574757265212070706b7075622e6f72672d3e70706b3a30
21        //压入堆栈的第3个公钥的数据长度
20525400657b227469746c65223a2250506b2d4f44494e2d73616d706c65222c22
21        //压入堆栈的第4个公钥的数据长度
20656d61696c223a2270706b70756240676d61696c2e636f6d222c226175746822
21        //压入堆栈的第5个公钥的数据长度
203a2232222c2261705f6c697374223a5b22687474703a2f2f70706b7075622e6f
21        //压入堆栈的第6个公钥的数据长度
0972672f41502f225d7d0000000000000000000000000000000000000000000000
56        //Ox56 代表 OP_6 (将脚本代码6压入堆栈)。与后面的0×51合在一同表示1of6多重签名
ae        //Oxae 代表 OP_CHECKMULTISIG (执行多重签名验证)
        /*** 第三组输入 ***/
e6cac22300000000 //输入的比特币数量,UINT64,8个字节。字节序需翻转,
19        //输入描绘脚本字节数, 0×19 = 25字节,由一些操作码与数值构成
76        //脚本起始操作 0×76 代表 OP_DUP(复制栈顶元素)
a9        //地址类型 0xa9 代表 OP_HASH160(栈顶项停止两次HASH,先用SHA-256,再用RIPEMD-160)
14        //地址长度 0×14 = 20字节
391ef5239da2a3904cda1fd995fb7c4377487ea9  // 对应的HASH160值,20字节
88        //0×88 代表 OP_EQUALVERIFY (运转脚本的二进制算术和条件,如后果为0,之后运转OP_VERIFY)
ac        //Oxac 代表 OP_CHECKSIG (买卖所用的签名必需是哈希值和公钥的无效签名,假如为真,则前往1)
        00000000     // 锁定工夫,UINT32,固定4字节
         
        结合前文说阐明的ODIN协议定义内容,经过上述买卖数据中的蓝色区域局部就可以复原解析出对应ODIN标识注册音讯。
         
        三、运转示例顺序
        示例顺序包括两局部:
1. OdinMonitorTestnet.js :
监测比特币测试网络Testnet相关区块链数据的变化,从中解析出新注册的ODIN标识。
源码可以从这里下载: http://ppkpub.org/sample/OdinMonitorTestnet.js
        2. OdinRegisterTestnet.js :
在比特币测试网络Testnet注册一个新的ODIN标识。
源码可以从这里下载: http://ppkpub.org/sample/OdinRegisterTestnet.js
        将上述示例代码下载保管到已装置Node.js的测试环境下(保管文件名为 OdinRegisterTestnet.js和OdinMonitorTestnet.js)。
关于如何装置Node.js测试环境, 如有需求可以参考《比特币区块链开发由浅入深指南1》外面的阐明停止装置( http://www.8btc.com/blockchain_develope_lesson_1 )。
        在运转上述示例顺序前,请确认已装置比特币测试网络(bitcoin-testnet)的Docker运转环境。如尚未装置可以参考《比特币区块链开发由浅入深指南2》外面的阐明停止装置( http://www.8btc.com/ppkpub_blockchain_develope_lesson_2 )。
        在Node.js开发测试环境新开一个文本终端窗口,在命令行下输出以下命令启动监测示例顺序:
node OdinMonitorTestnet.js
        然后新开一个文本终端窗口,在命令行下输出以下命令运转注册示例顺序:
node OdinRegisterTestnet.js
        运转注册示例顺序后,到比特币测试网络(bitcoin-testnet)的Docker运转环境的命令行下输出”make generate
BLOCKS=6″, 模仿发生新的区块记载,刚发生的买卖记载就会失掉无效确实认并被存入区块链中。
这时在监测顺序的运转界面上就会提示解析到新的ODIN标识注册记载(如下图所示)。
       

5b2c6ff0a02e7.jpg

5b2c6ff0a02e7.jpg

       
                 编辑:却原来
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩推荐

让创业更简单

  • 反馈建议:[email protected]
  • 客服QQ:405645438
  • 工作时间:周一到周五 10:00-19:00

云服务支持

精彩文章,快速检索

关注我们

Copyright   ©2015-2016  海纳百客  Powered by©  山东融儿信息科技  ( 鲁ICP备16022535号-4 )