从开发人员的角度来看,比特币的主要优势之一就是操作起来非常容易。比特币没有第三方依赖性,没有专有的API,也没有快速变化的接口。您所需要的只是您自己喜欢的编程语言,而且很可能已经有了一个简单的比特币库,您可以使用它在几个小时内开始发送和接收比特币。本文的目的是介绍其中一些库,并展示使用任何语言的比特币地址和交易的基础知识.
地址,密钥,交易,哦,我的!
通常,比特币协议可以分为三个部分:地址和密钥管理,交易以及区块和挖掘。作为开始的比特币开发人员,区块和挖矿对您而言并不重要;在大多数情况下,仅依靠第三方交易获取服务就可以更容易地抽象出区块的概念,如果您对挖掘感兴趣,最好的方法就是简单地购买标准的比特币矿机。地址,密钥和交易,但是,您根本无法避免与之打交道.
在比特币密钥管理中,您需要处理三种类型的对象:私钥,公钥和地址。您可能已经听说过公钥密码学中的“私钥”和“公钥”一词;这正是我们在这里讨论的私钥和公钥。但是,比特币使用一种称为椭圆曲线密码的新型加密方式,而不是使用像RSA这样的基于保理的旧式加密算法,因此比特币密钥看起来与说的有些不同。, PGP密钥. 私钥如下所示:
9d86361789d13823fd888fa45c9b356b76d41a7e33b2b2c3056632721cc4c1255
其对应的公钥为:
04d8f08938e78447b2b1a629c503d5e17483b0d15751a9e8f83c8460e6ec32fd68d0b4068e83c012f54df995e52ed8bae38056a8d922f9687200ae83e5a6728dff
可以将私钥转换为公钥,但是不能将公钥转换为私钥。比特币地址实际上是公钥的哈希值;上述公钥对应的比特币地址为:
172YRdGzPqyXm9rm1EWKwPXTRsmcApoPQ6
您可能会注意到的一件事是,比特币地址不像私钥和公钥那样采用十六进制形式。这是因为,对于某些格式,比特币使用自己的表示格式,即base58check。 “ base58”部分来自这样一个事实,即使用了58个不同的字母和数字。 O,0,l和I被忽略了,因为它们很容易彼此误解。基数58与基数2或基数3或基数10相似。例如,基数2中的数字31337为“ 111101001101001”;在基数3中为“ 1120222122”,在基数10中为“ 31337”,在基数16中为“ 7a69”,在基数58中为“ AKJ”,最后在基数256中为“ zi”。 base58check的“检查”部分也很重要;这意味着将消息散列的前四个字节添加到消息的末尾,然后再将结果编码为base58。例如,将“ zi”从基数256转换为基数58的过程如下:
- 步骤1:校验和= sha256(sha256(’x00’+’zi’))(请注意,我们在前面添加了一个零字节)’97fbc63584f26bd0109f99d467c447607dbecff51b903e450207466114672261′
- 第2步:中间=“ x00” +“ zi” +校验和[:4](二进制格式)“ x00zix97xfbxc6x35”
- 第3步:转换为以58为基数的“ 123xZAaruJ”
但是,您个人不需要处理所有这些复杂性;比特币库可以为您处理所有事情,我们将在本文的后面部分讨论。但首先,交易处理.
要记住的第一个重要点是,比特币在内部没有“帐户”或“余额”的概念。所有资金都存储在称为“交易输出”的对象中。一项交易具有一个或多个输入,每个输入都花费一个现有的未使用交易输出(“ UTXO”),然后该交易可以发送的总输出量与输入中的相同数量的BTC。以下是反序列化形式的交易:
{ "锁定时间":0, "ins":[{ "脚本": "", "外点":{ "指数":0, "杂凑": "319ba90f1645eed46a8fd48e9754ca979c3371f59099d32634a8b56549ce02aa" }, "顺序":4294967295}], "出局":[{ "价值":1000000, "脚本": "76a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac" },{ "价值":344164, "脚本": "76a914c4c5d791fcb4654a1ef5e03fe0ad3d9c598f982788ac" }], "版本":1}
并以序列化形式:
0100000001aa02ce4965b5a83426d39990f571339c97ca54978ed48f6ad4ee45160fa99b310000000000ffffffff0230750000000000001976a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac204e000000000000000000a
“ script”参数只是表示地址的另一种方式;将上述交易中的两个脚本转换为地址,我们分别得到“ 1FxkfJQLJTXpW6QmxGT6oF43ZH959ns8Cq”和“ 1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T”。交易中的单个输入是对先前交易输出的引用;在区块链上查找它,我们可以看到有1354164个satoshis可供使用(1个satoshi是比特币的最小单位,其中1亿个聪子= 1 BTC)。两个输出花费1344164,剩下10,000聪作为费用.
请注意,事务只能全部花费输出,而不能部分花费。为了解决这个问题,标准机制是“更改”的概念-将一个输出发送到预期的目的地,然后将另一个输出发送到您自己的其余部分。上面的交易就是一个例子–第一个输出是0.01 BTC付款,第二个是零钱。创建交易后,您需要使用与每个地址相对应的私钥对每个输入进行签名。这样做的过程非常复杂,但是幸运的是,库可以为您处理它。签名后,上述交易如下所示:
0100000001aa02ce4965b5a83426d39990f571339c97ca54978ed48f6ad4ee45160fa99b31000000008b48304502203bcabb367ca84b2af394597bff4a6169fa55b156708557256d2c584f1bd54e1502210086fdf257e58dbb5e1f3b4686f4385e86ea89e677a6c90a3c87ce276d88ad2b31014104e6eb4c73192bcc7b63f7e3c05ed52c0d98abac6f6aa0876e2e57eeda6b60fe03098cb63633d08077b14cc30efe9bc5c9866ebc1297c03399e27381539025f887ffffffff0240420f00000000001976a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac64400500000000001976a914c4c5d791fcb4654a1ef5e03fe0ad3d9c598f982788ac00000000
然后,最后,您需要将已签名的交易推送到区块链。手动执行此操作的最佳方法是在 http://blockchain.info/pushtx. 基本上,这就是比特币的全部内容–直到我们进入诸如多重签名交易之类的高级功能之前,但最好在另一篇文章中对其进行更详细的描述.
比特币化
Bitcoind是核心比特币开发团队创建的“参考客户端”。它是一个完整的比特币节点,可下载整个区块链并处理交易。比特币化在功能上有所限制。例如,除非您事先导入了该地址,否则它无法为您提供地址的交易历史记录。但是,它仍然非常强大。一旦下载了bitcoind 从其项目页面 并构建它,第一步是在您的比特币目录(在Linux上是〜/ .bitcoin)中创建一个文件,其内容如下:
rpcuser = userrpcpassword = passrpcport = 8332txindex = 1
如果需要,请使用您自己的用户名和密码替换。完成此操作后,导航到包含可执行文件的目录(如果您的版本随附可执行文件,则为/ bin;如果您自己制作的则为/ src),然后在命令行上运行./bitcoind –守护程序以启动该文件。守护程序。到那时,您有两种运行bitcoind命令的方式.
第一种方法比较简单:只需输入“ bitcoind”,然后在命令行输入命令名称和自变量即可。例如:
>./ bitcoind getblockhash 100000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048>./ bitcoind getblock 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048 { "杂凑" : "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048", "确认书" :212362, "尺寸" :215, "高度" :1, "版本" :1, "Merkleroot" : "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098", "发射" :[ "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098" ], "时间" :1231469665, "随机数" :2573394689, "位" : "1d00ffff", "困难" :1.00000000, "以前的区块哈希" : "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "nextblockhash" : "000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd"}> bitcoind getrawtransaction 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd51209801000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000
第二种方法是使用JSON-RPC。 JSON-RPC是通用接口,允许您连接到bitcoind并使用任何语言(甚至可能从另一台计算机)使用其运行命令。比特币Wiki 有一个页面 描述使用不同编程语言进行JSON-RPC调用的一些方法;为了简洁起见,我只列出两个.
在Python中:
导入httplib,json,base64def mkrequest(URL,user,pass,method,params,hasresponse = True):connection = httplib.HTTPConnection(url)postdata = json.dumps({ "方法": 方法, "参数":params})req = urllib2.Request(’http:// localhost:8001’,postdata,{‘Authorization’:b’Basic’+ base64.b64encode(user +’:’+ pass),})如果hasresponse:返回urllib2.urlopen(req).read()。strip()
并在命令行上使用curl:
curl –用户–传递–数据二进制'{"方法":,"参数":[,…]}’http:// localhsot:8332
SX
有两种替代的命令行工具可用于处理比特币交易: pybitcoin工具 和 SX. SX由libbitcoin开发者Amir Taaki创建,现在由一个小团队积极维护。 pybitcointools是我自己写的。语法非常相似,尽管有所不同。安装SX相对简单;您需要做的就是下载一个名为install-sx.sh的文本文件,安装一些库,然后运行该文本文件。在Ubuntu上,命令行说明如下:
wget http://sx.dyne.org/install-sx.shsudo apt-get install git build-essential autoconf libtool libboost-all-dev pkg-config libcurl4-openssl-dev libleveldb-dev libzmq-dev libconfig ++-dev libncurses5-开发qrencodechmod + x install-sx.sh./install-sx.sh
然后,一旦安装了SX,您可以使用它进行一些操作。如果您只是在构建付款处理平台,那么只需获取地址的历史记录并可能获取交易就足够了:
> SX历史114tTpMrJHJpNvkPZmz8KVcJoQjD5UtosdAddress:114tTpMrJHJpNvkPZmz8KVcJoQjD5Utosd输出:eb84dd62287a1d85e3f31b0de869534a8f800fad559e36f779a45470aa4e8976:0 output_height:277978值:100000支出:3216bc4b8294532cddab1ae2a95a336ee841be02e6246c1ad9cf1e7db788d10e:0 spend_height:277979Address:114tTpMrJHJpNvkPZmz8KVcJoQjD5Utosd输出:5a45c86c5aff8200db4c7f8a91b9a3e51932510cbeb2dc173fc8611bee5aeaaf:1 output_height:278076值:70000支出:4817f863ace4337be7ea95476b2c73723fb83fbe0e1a6236fbf30f2a8aa14dee:0 spend_height:278076> SX取事务516f0bfe2ed3703112434f645fdc7d805bba51c94c9d8f88b666f1c832eb423c010000000142f2e85e078a214d5c61b58276da5cec01311e026355c570b650c2e665585011010000008a47304402203aa40adefd0dc4a3f960b230a9e1b284d78a4b4dec9119368fdeb006af3b6c7b022071165df64ea4502003d8b6e9c46c28b5c5c748226737b4fe1ee8fc4269b50ee5014104a70f7c8b0a835f549f061b725bd3e06744963a07cb2f76097bafe040f939d6e6d23c6cc89e5b50aa944d26b7d1c8a1f3b8b4e6f7c2f54cf35fb46b0e4b9442e1ffffffff02a0860100000000001976a914ba55b9859c7356c5e5549c8a30c463e3db64e84488ac80054800000000001976a9145a35a4558b8a0140f4a73aaac0be891b99e3790e88ac00000000
如果要计算地址的余额,则需要获取历史记录(也许使用sx history -j 114tTpMrJHJpNvkPZmz8KVcJoQjD5Utosd以获得更便于计算机使用的格式),过滤掉已花费的项目,并添加其余的部分。这将为您提供地址可供使用的卫星总数(1亿卫星= 1 BTC)。如果要使事务有意义,可以将事务粘贴到文件中,然后在文件上运行sx showtx.
您还可以使用私钥和地址:
> sx newkey > priv1> 猫priv15JRLqUG1FwSimZwSzNLPG1BKCENCRhDwkVveL59AEqt97bbkCD1> 猫priv1 | sx pubkey04bfc8181cd833567e078cb03ec44034c226bf23dbb2482db53513e0fcea205c40bd6dc73db0c33296d8fa8e0bd347099e07787e17a2a40293004efdb512ff51e2> 猫priv1 | sx addr1B772AGqphjSQqqeecdTBmnBdgMBPYDXt7
并进行交易。在这里,我们使用输出819171fa2eaa33fc684c800ae2ce34cff8400d4d966e995c6a2f0e970b6f703d:0将90000 satoshis发送到18qk7SqRHuS4Kf3f6dmsvqqv7iw1xy77Z6:
> sx mktx txfile.tx -i 819171fa2eaa33fc684c800ae2ce34cff8400d4d966e995c6a2f0e970b6f703d:0 -o 18qk7SqRHuS4Kf3f6dmsvqqv7iw1xy77Z6:90000> 猫txfile.tx01000000013d706f0b970e2f6a5c996e964d0d40f8cf34cee20a804c68fc33aa2efa7191810000000000ffffffff01905f0100000000001976a9145600d581a94f65067a09103609e919e3c01141ed88ac00000000> sx rawscript dup hash160 [`echo 1B772AGqphjSQqqeecdTBmnBdgMBPYDXt7 | sx encode-addr`] equalverifychecksig > 原始脚本> 猫raw.script76a9146ed8c762b24ba024df09cb323ea525b06da3acb788ac> 回声5JRLqUG1FwSimZwSzNLPG1BKCENCRhDwkVveL59AEqt97bbkCD1 | sx符号输入txfile.tx 0`cat raw.script` > 信号> 猫sig3044022069f05eacfe93fc6c028bd078228d7807af07c5ed7566491c709b181950d735830220788e089c63512c07239b94740a36de724b54c076192dbd27584b5b729986420d01> sx rawscript [`cat sig`] [04bfc8181cd833567e078cb03ec44034c226bf23dbb2482db53513e0fcea205c40bd6dc73db0c33296d8fa8e0bd347099e07787e17a2a40293004efdb512ff51e2] | sx设置输入txfile.tx 0 > txfile2.tx> 猫txfile2.tx01000000013d706f0b970e2f6a5c996e964d0d40f8cf34cee20a804c68fc33aa2efa719181000000008a473044022069f05eacfe93fc6c028bd078228d7807af07c5ed7566491c709b181950d735830220788e089c63512c07239b94740a36de724b54c076192dbd27584b5b729986420d014104bfc8181cd833567e078cb03ec44034c226bf23dbb2482db53513e0fcea205c40bd6dc73db0c33296d8fa8e0bd347099e07787e17a2a40293004efdb512ff51e2ffffffff01905f0100000000001976a9145600d581a94f65067a09103609e919e3c01141ed88ac00000000> sx broadcast-tx txfile2.tx
您还可以验证交易:
> sx validtx txfile2.txStatus:输入验证失败未确认:0
该错误是有道理的,因为我上面使用的输出已经用完了。总之,SX允许您从本质上组合一个重量级的“比特币客户端”,选择交易输出并手动进行交易。不过只是警告:这是非常冒险的事情,因为如果您不小心将交易输出的值设为零,则系统的级别太低而无法捕获您的错误,您最终将要支付90的费用.
比特币工具
Pybitcointools实际上是两件事合二为一;同时,它是一个Python库,可让您操作比特币地址,密钥和交易以及类似SX的命令行工具。要同时安装两者,请下载pybitcointools 这里, 导航到该目录,然后运行sudo python setup.py install。从那里打开一个Python控制台,然后从pybitcointools import *输入,以导入所有pybitcointools命令.
第一键管理:
> priv = sha256(“一些大而长的大脑钱包密码”)> priv’57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4′> pub = privtopub(专用)> pub’0420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9′> addr = pubtoaddr(pub)> addr’1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6′
但是,如上所述,pybitcointools还包括pybtctool,这是一种类似于SX的命令行工具。要使用pybtctool,请运行:
> pybtctool sha256 "一些大的长脑袋密码"57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4> pybtctool privtopub 57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a40420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e23a> pybtctool pubtoaddr 0420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e91CQLdb
现在,开始历史记录和事务获取:
> h =历史记录(地址)> H [{ ‘输出’:u’97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0’ , ‘值’:50000, ‘地址’:u’1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6 ‘},{‘ 输出 ‘:u’4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1’, ‘值’:50000,“地址’:u’1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6’}]> fetchtx( ’97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e’) ‘0100000002b8497b5d250420d0e0ef55150ae49f451846791f54b858e4d7b50e23c087b560010000008c493046022100a49c01bbf7a6200b05c61072f79fbbcbb56182e0082f85734ff501efd8f2180a022100a6d2b19a1023c4197206b1ea0d58165fa4d6170e7823d90d1cdb0f2704ceb5d0014104ba8b7ec1189b046d0f6dc68d2cafa4bfc30ea34b8f52a0f815550ffd5f5dfe12df06f2c9a3c1b206b833fe274601fe19e0afd9c47e251ba247edfa7a0237ab3affffffff71d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c000000008c493046022100c7309b13e54896533ebb6c369b1f46992ed7f8d96c8eb606cfd66a06bf6a061d022100e1cb8d32b380dac42584a5e1a6ff00c209767471b8bb82a13bf8d36221a39aa9014104a88f9a448cfcf259df1da679a37dd8e4c148cb6f0ba6a9b1e7d7019b09ef1034495f02d4cdf27d2bab41da3bce3f9508b20f6ad265b5940799610b69a12d02a5ffffffff0250c30000000000001976a9147d13547544ecc1f28eda0c0766ef4eb214de104588ac953d0800000000001976a9145fe616df99d43ae8001ca941f381572cd1cb74b388ac00000000’
请注意,pybtctool包含一个方便的-s开关,可用于将某些操作链接在一起:
> pybtctool sha256’一些大而长的脑袋密码’ pybtctool -s privtoaddr | pybtctool -s历史[{ ‘输出’:u’97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0’ , ‘值’:50000, ‘地址’:u’1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6 ‘},{‘ 输出 ‘:u’4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1’, ‘值’:50000 ,“地址”:u’1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6’}]> pybtctool fetchtx 97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e | pybtctool -s反序列化{"锁定时间":0, "出局":[{"价值":50000, "脚本": "76a9147d13547544ecc1f28eda0c0766ef4eb214de104588ac"},{"价值":540053, "脚本": "76a9145fe616df99d43ae8001ca941f381572cd1cb74b388ac"}], "版本":1, "ins":[{"脚本": "493046022100a49c01bbf7a6200b05c61072f79fbbcbb56182e0082f85734ff501efd8f2180a022100a6d2b19a1023c4197206b1ea0d58165fa4d6170e7823d90d1cdb0f2704ceb5d0014104ba8b7ec1189b046d0f6dc68d2cafa4bfc30ea34b8f52a0f815550ffd5f5dfe12df06f2c9a3c1b206b833fe274601fe19e0afd9c47e251ba247edfa7a0237ab3a", "外点":{"指数":1, "杂凑": "60b587c0230eb5d7e458b8541f794618459fe40a1555efe0d02004255d7b49b8"}, "顺序":4294967295},{"脚本": "493046022100c7309b13e54896533ebb6c369b1f46992ed7f8d96c8eb606cfd66a06bf6a061d022100e1cb8d32b380dac42584a5e1a6ff00c209767471b8bb82a13bf8d36221a39aa9014104a88f9a448cfcf259df1da679a37dd8e4c148cb6f0ba6a9b1e7d7019b09ef1034495f02d4cdf27d2bab41da3bce3f9508b20f6ad265b5940799610b69a12d02a5", "外点":{"指数":0, "杂凑": "4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171"}, "顺序":4294967295}]}
注意反序列化命令;您当然也可以在pybitcointools库中使用它。当然,您可以进行交易:
> pybtctool mktx 97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0 4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1 pybtctool -s符号0 57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a401000000025e46552eb977f908fa8b3ee9d2943a8fa6d96c3b768a5f250ce485acd8c7f797000000008b483045022100dd29d89a28451febb990fb1dafa21245b105140083ced315ebcdea187572b3990220713f2e554f384d29d7abfedf39f0eb92afba0ef46f374e49d43a728a0ff6046e01410420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9ffffffff71d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c0100000000ffffffff01905f0100000000001976a9143ec6c3ed8dfc3ceabcc1cbdb0c5aef4e2d02873c88ac00000000
然后,您可以使用pushtx或eligius_pushtx推送事务以直接推送到中型采矿池。 eligius_pushtx对于普通比特币节点拒绝的所谓“非标准”交易很有用;例如,可以通过此处发送多于三个方之间的多重签名交易.
图书馆
Pybitcointools和SX并不是仅有的工具。几乎每种语言都有比特币库。这里有一些:
- BitcoinJS(Javascript): 斯蒂芬·托马斯(Stefan Thomas)的原始版本, 或者 我的叉子
- python-ecdsa (Python)
- 哈斯科因 (哈斯克尔)
- 利比币 (C ++)
- 比特币 (Java)
- btcd(开始)
快乐编码!