区块链中文技术社区 - Bitcoin
type: channel
link: https://www.bcskill.com/index.php/category/Bitcoin/
items: 验证BTC地址是否有效
items: 比特币多签和脚本调研
items: btc-rpc-explorer
items: Bitcoin address and private key generator
items: 理解与计算比特币难度值Difficulty
items: 易懂的比特币工作机理详解
items: Blockchain推荐阅读
items: 区块链中的“双花”问题

验证BTC地址是否有效
type: item
date: 2021-09-24T09:20:14+08:00
description: validateaddress "address" Return information about the given bitcoin address. Arguments: 1. address (string, required) The bitcoin address to validate Result: { "isvalid" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned. "address" : "address", (string) The bitcoin address validated "scriptPubKey" : "hex", (string) The hex-encoded scriptPubKey generated by the address "isscript" : true|false, (boolean) If the key is a script "iswitness" : true|false, (boolean) If the address is a witness address "witness_version" : version (numeric, optional) The version number of the witness program "witness_program" : "hex" (string, optional) The hex value of the witness program } Examples: > bitcoin-cli validateaddress "1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc" > curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "validateaddress", "params": ["1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc"] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/ https://bitcoincore.org/en/doc/0.18.0/rpc/util/validateaddress/

比特币多签和脚本调研
type: item
date: 2020-05-11T10:04:00+08:00
description: 调研背景 公司有个针对比特币的资产使用场景， 一个比特币的账户有5个多签见证人控制，满足3个人签名就可以修改其中一个人的签名权限，和转移50%的资产，满足5个人同时签名就可以转移100%的资产。 之前一直All in EOS,所以先查下相关的资料吧。 参考资料 https://www.qunfengshe.com/articles/QXJ0aWNsZTo4MA== https://zhuanlan.zhihu.com/p/25461051 https://m.8btc.com/article/350625 https://juejin.im/post/5aa60e65518825557005a7f6 https://en.bitcoin.it/wiki/Script#Opcodes https://github.com/bitcoin/bitcoin/blob/master/src/script/interpreter.cpp https://gist.github.com/gavinandresen/3966071 https://siminchen.github.io/bitcoinIDE/build/editor.html 对比EOS 按需求我们等价到EOS链图灵完备的智能合约实现方式，需要以下几步 准备一个资产账户，5个管理账户，并将资产账户active和owner的权限按权重（5）和阈值（3）设置成5个管理账户（set account permission），且能满足达到3/5权重，再次修改账户权限。 编写智能合约，Table中记录当前资产总额和已转出的资产，合约“监听”转账通知 transfer"),当有新转入，累加到资产总额。当已转出的资产超过50%时，验证当前执行是否同时有5个账户的签名 require_auth(1) - require_auth(5)，如果不满足则失败assert,没超过50%前，无需合约判断，链本身会在第一步设置的资产账户的权重和阈值那里自行判断，也就是至少满足3/5才会执行到此合约里。 将上面的合约部署到资产账户，就能满足需求场景了。 调研针对比特币的需求结论 针对权重和阈值分配，比特币多重签名可以支持。但相对EOS权限管理，只能等份分割，某个人想拥有多大比例的权重，就拥有对应个数的私钥。 比特币脚本不是图灵完备的，无法实现数据存储，只能做一些简单的堆栈方式的运算，且当合约执行时，它没办法指定被影响到的比特币金额，要么全部解锁，要么就完全不解锁，因为比特币上的智能合约只是一个锁定脚本，成功解锁前后，没有中间状态，导致实现复杂协议很困难。 考虑到使用场景，比特币简单粗暴临时方案 使用权重和阈值 分别是5-5，以及5-3，创建两个比特币地址。5-5账户地址存放100%资金，由5个人同时签名后将资金的 50%转移到 5-3账户地址。这样能满足 5-5可使用100%资金，5-3使用50%资金。相对资产单一账户来说，超过单个账户余额边界时，会导致2笔手续费。

btc-rpc-explorer
type: item
date: 2019-07-23T15:59:08+08:00
description: github:https://github.com/janoside/btc-rpc-explorer 演示：https://btc.chaintools.io/

Bitcoin address and private key generator
type: item
date: 2019-06-13T14:39:14+08:00
description: https://sourceforge.net/projects/address-generator/ https://brainwalletx.github.io/

理解与计算比特币难度值Difficulty
type: item
date: 2019-05-07T18:16:16+08:00
description: 挖矿实际就是在暴力猜谜，而要猜多少次，全凭全网共识的一个难度值。只有猜出一个数字能使得区块的哈希符合难度，才算答对谜题。 那么这个猜谜游戏由于越来越多人的加入，势必会更快猜出。所以为了维持一个恒定的游戏时间(两周)，每次游戏难度均会根据上次游戏的用时而重新计算。 游戏越来越难，如何抢在别人前面猜出呢？所以开启了抱团团战模式（矿池）加入游戏，使得解谜速度更快也更难。速度与难度总是此消彼长。 这也是为何在2014，2015年后难度值呈几何级数式增长。当然也因解谜的设备（矿机）更新换代越来越快。 比特币难度值Difficulty 难度值在区块中并不记录，仅仅是为了人类直观感受解题难度而演变出的一个浮点数。公式如下： 此处的 difficulty_1_target 为一个常数，非常大的一个数字。表示矿池挖矿最大难度。目标值越小，区块生成难度越大。 难度值如何存储在区块中的 在区块中存储的是Target，但是将Target经类似于浮点数的一种压缩表示法，字段为bits。例如，如果区块bits记录为0x1b0404cb，那么他表示的十六进制的Target值为： 0x0404cb * 2**(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000 在计算时，后面3个字节0x0404cb作为底，前面1字节0x1b表示次方数。具体压缩过程如下： 将数字转换为256进制数 如果第一位数字大于127(0x7f),则前面添加0 压缩结果中的第一位存放该256进制数的位数 后面三个数存放该256进制数的前三位，如果不足三位，则后面补零 例如，将数字1000压缩，先转换为256进制数 1000 = 0x03 * 256 + 0xe8 * 1 那么是由两个数字构成： 03 e8 第一个数未超过0x7f,则不需填0，但长度两位低于三位，在后面补零，最终表示为： 0x0203e800 有比如数字 2^(256-32)-1,转换为256进制为： ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 第一位已经超过0x7f,前面添加零： 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 现在长度为28+1=29 (0x1d),则最终压缩结果为：0x1d00ffffff。此时就用精度缺失，后面的26个ff 被丢弃了，因为总共才4字节，前两字节已经被长度和添加的0所占用，只剩下2个字节来存储数字。如果我们将压缩结果0x1d00ffffff解压，会是原值吗? 实际结果为： 0x00ffff *256** (0x1d - 3) = ff ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 而此数为比特币的最大Target值，此时难度最小为1。将其结果前面添加4位0，其结果为： 0x00000000FFFFFF0000000000000000000000000000000000000000000000000000 此最小难度值1，在矿机上一般使用保留尾部的FF，则为： 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 称上面数字为pool difficulty1 矿池难度1，矿池难度简称pdiff。而比特币客户端表示如此精度，也许是困难的，所以不保留尾部的FF,则结果为： 0x00000000FFFFFF0000000000000000000000000000000000000000000000000000 此值，在客户端上称之为bdiff。 如何查看当前难度值 当前难度值，可以在许多提供服务的网站上查看图表数据： https://bitcoinwisdom.com/bitcoin/difficulty https://data.bitcoinity.org/bitcoin/difficulty/5y?t=l https://btc.com/stats/diff 最大难度值是多少 按公式来看，当current_target=0时diffculty无穷大，标志着难以计算。而实际上current_target不会为0，最小current_traget=1时，难度值最大，接近2^(256-32)。 最小难度值是多少 当current_target=difficulty_1_target 为最大值时，…

易懂的比特币工作机理详解
type: item
date: 2019-04-03T20:31:00+08:00
description: 从做局角度思考比特币,以及比特别机理的其他 应用可能 前言 原始论文： 中文版：《比特币：一种点对点的电子现金系统》 http://wenku.baidu.com/view/f26c8d916bec0975f465e236.html 英文版：《Bitcoin: A Peer-to-Peer Electronic Cash System》 http://wenku.baidu.com/view/2e3f91bb1a37f111f1855b50.html 网络上介绍比特币的文章。 https://en.bitcoin.it/wiki/Main_Page 很详细。 http://blog.codingnow.com/2011/05/bitcoin.html http://zhiqiang.org/blog/it/technical-document-of-bitcoin.html http://www.showmuch.com/a/20110530/233347.html http://ivarptr.blogspot.com/2011/05/bitcoin_31.html http://www.8btc.com 以下做详细介绍。介绍方法为，尽可能简化概念，用日常可对应的概念对照比特币技术概念。不 会很精确，但保证概念正确 一，比特币运行机理概述 本章介绍比特币世界的运行机理。比特币体系是由账簿(block)，交易单，钱（bitcoin），和 交易(transactions)等几个概念组成。 1 账簿（BLOCK），账簿链，与交易单 1）账簿 比特币体系，不存在单独货币。只存在账簿（BLOCK）与交易单。每个人有自己的账户 ID。 每一次交易，获得多少钱，花多少钱，全以交易单形式记录在一个全世界唯一的账簿上。账簿 上会记录很多交易单。相当于银行交易底单。只要账簿上收支都记录清楚，这个世界不需要单独 货币也可以做交易（等于大家都刷卡交易）。 如图： 账簿有很多本。每本账簿只记录比特币全世界 10 分钟内的交易信息。每 10 分钟一个新的 账簿被产生（制造/创建）出来。所以账簿随时间流逝会不断增多。每个人每做一笔交易，某个 账簿上就会记录这笔交易单。这个记录过程是比特币软件通过网络自动完成的（黑客很难伪造）。 目前比特币世界存活了 4 年多，就有大概 24 万多本账簿了。（4 年365 天24*60 分钟/10 分钟 = 21 万本账簿） 2）账簿链 账簿本全局唯一。因为这个世界发生过的交易肯定是全局唯一的。记账记录也会是唯一的。 所有账簿本是被一根链子串起来的（双向链表---账簿链）。每个账簿里，都记录着前一个账簿 和后一个账簿的索引。知道任何一个账簿，都能顺藤摸瓜向前或者向后找到所有账簿。这也决定 了账簿记录交易的前后关系。这等于是银行的对账底单。后面会说交易的前后关系对比特币体系 是最核心最重要的事情。 如图： 比特币世界（以下简称“世界”），只有一套唯一的账簿（由于被串起来，也就是账簿链）。 在每个用户 PC 上都保存一个备份。等于每个用户都保存一份这个世界从诞生起到当下所有交易 的记录备份（全球所有用户的所有交易）。记录备份较大，比特币软件会有优化手段，这里不细 说。 每个用户都备份所有交易记录，这就是比特币没有银行的机理，因为不需要一个中心来储 存所有交易，每个人都必须要储存所有的。 3）交易单 交易单记录一笔交易的具体信息。比如付款人账号 ID，收款人账号 ID，付款金额，付款人 签字，收款人公钥等。 世界中，每隔差不多 10 分钟，就会有一个新的账簿本制造出来，添加到世界里（加到账簿 链尾部）。有了新的账簿，这十分钟里发生的交易单，就都写到这个新产生的账簿中。查看账 簿可以去这里：http://blockexplorer.com/ 输入账簿（BLOCK）的序号，从 0 到 24 万，就可 以看每个账簿里记录的交易单。 可以看到序号靠前的账簿（BLOCK）里都没有交易单。说明账簿 产生前 10 分钟里没有交易（那时候大家还根本不知道这么个玩意儿）。 世界中，先临时记录下 10 分钟里的交易。然后用这些交易单，创建一个新账簿。把这些记 录都放进去。之后这本账簿就封存作为底单。只提供查询用。每个用户账户有多少钱，都要从这 些底单中推算出来。 2 钱（比特币/bitcoin）的由来---账簿创建（挖矿） 1）钱的由来 有账簿，可以记录交易。但是世界中总要有钱可花。初始时可以花的钱怎么来的？ 世界中每个用户都可以创建账簿。谁创建账簿，就给谁钱！ 一个账簿被创建后，这个账簿里初始就有钱。钱归创建者所有。所以每个账簿第一条交易 单总是“世界给予创建者张三 50 元”。注意，比特币世界里没有独立的钱，只有交易单。钱都 是通过交易单体现的…

Blockchain推荐阅读
type: item
date: 2018-06-21T15:16:38+08:00
description: Blockchain 区块链 v1.0 推荐阅读 比特币相关 写在前面：与其说比特币是区块链技术的第一个应用，不如说区块链技术是为了实现虚拟数字货币比特币而出现的一种重组现有技术而得到的“新”技术，至于除了数字货币之外还能实现什么应用，我想等比特币落地那一天一切都会揭晓。 白皮书相关 Bitcoin: A Peer-to-Peer Electronic Cash System - 比特币白皮书（英文原版） Bitcoin: A Peer-to-Peer Electronic Cash System - 比特币白皮书（多种语言版本） 比特币白皮书：一种点对点的电子现金系统 | 巴比特 - 比特币白皮书（中译版） 比特币白皮书 个人翻译+注解 - 比特币白皮书（知乎）实现机制 精通比特币 | 巴比特图书 精通比特币（第二版） | 巴比特图书 区块链技术指南 比特币开发者指南-巴比特图书官方网站 Bitcoin - Open source P2P money官方文档 Developer Documentation - Bitcoin - 开发者文档 Bitcoin Improvement Proposals - 改进建议 Technical Pages - Wiki - 维基官方源码 fkysly/bitcoin0.1.0 the legendary Satoshi version bitcoin/bitcoin v0.12.1 bitcoin/bitcoin last release源码剖析 比特币源码解析 - 呼，是出一口气；吸，是争一口气! 比特币源码解读 - ttblack v0.9.5rc2 比特币源码研读 - 菜菜子_forest 0.14 比特币源码剖析 - mistydew v0.12.1比特币核心服务启动流程 v0.12.1 github:转载地址

区块链中的“双花”问题
type: item
date: 2018-06-20T18:54:32+08:00
description: 我们举个简单的例子，比如你在商场刷卡买东西。这个行为面临三种危险： 首先，刷卡这个行为，验证的是你的信用卡信息，也就是说只要给刷卡机提供同样的信息，就能从你的账户里把钱刷走。没错，很多朋友都听说过，有犯罪组织专门从事复制卡信息的勾当，然后“盗刷”你的卡。在一些不发达国家的小店里刷卡就特别容易中招。 其次，负责记账和结算的卡组织和银行的服务器可能被黑客攻破，造成数据泄露和伪造交易。回想这些年一波又一波某某大公司数据库被黑客攻入的新闻，这危险并非危言耸听。（好吧，认真的geek会说这里用词应该是cracker骇客而非hacker黑客，不过这年头认真的人越来越少了） 最后，还有一种可能，就是用卡人自己可能利用系统网络延迟，在进行第一笔交易、用完所有额度后，趁系统还没记账把额度扣完，立刻进行第二笔交易，形成诈骗。当然目前的结算系统延迟极小，这情况不太可能，不过像在优惠券或者抢购资格这种另外搭建的相对脆弱的系统上还是有可能的。 网上支付也一样，犯罪分子可以用特殊手段（例如木马，伪造WIFI等）截获你跟服务器之间的传递数据，如果商家加密技术太弱的话信息就可能被破解——嗯，某国很多时候数据干脆是不加密的。所以大家才一直被警告不要乱装程序、不要连可疑的WiFi。 区块链是怎么处理这些问题的呢？我们以比特币交易为例，逐条分析。 首先，比特币拥有者想要完成某项交易，比如买手机吧，他会向全网广播：我小A向小B支付1个比特币（嗯，这金额大致可以买个iPhone 7P）。 与这条信息一起的，还有一条加密信息，这条信息是用Hash函数对上一条信息加密生成一个摘要后，再用A的私钥进行加密的（称为私钥“签名”）。 接收到这条信息的B和其他用户先用同样的Hash函数对明文信息生成摘要，再用A的公钥对加密信息进行解密，如果解密得到的摘要与明文生成的摘要相同，便认为信息确实是A发出的，且没有经过篡改。 A的公钥和Hash是公开的，私钥则无法算出，只有A知道，这样就既保证了交易的达成，又保证了A的信息无法被窃取。 其次，由在POW（运算力证明）中胜出的矿工负责这段时间的记账（我们之前讲过，“阅读原文”），事先完全无法知道究竟哪个矿工来记账，黑客也就无从黑起，除非碰运气。 最后，在传统系统中因为结算速度极快而不太可能的情况，在比特币网络中反而可能性比较大。如昨天所说，因为没有中心化的管理者，交易确认的时间要长很多，使得这种诈骗有可能实现，这就是比特币的double spending双重花费问题，简称“双花”。 对于双花问题，比特币网络，或者说区块链网络，是这么应对的： -每笔交易都需要先确认对应比特币之前的状态，如果它之前已经被标记为花掉，那么新的交易会被拒绝。 -如果先发起一笔交易，在它被确认前，也就是这个时间段的交易还未被记账成区块block时，进行矛盾的第二笔交易，那么在记账时，这些交易会被拒绝。 -上面只是小伎俩，现在tricky的部分开始了。如果诈骗者刻意把第一笔交易向一半网络进行广播，把第二笔交易向另一半网络广播——这个诈骗者智商还挺高——然后两边正好有两个矿工几乎同时取得记账权，把各自记的block发布给大家的话（这个概率很低），网络是不是会混乱呢，区块链的规则是这样的：先选择任意一个账本都可以，这时候原来统一的账本出现了分叉： 但是在两个账本中各只有一笔交易，诈骗者不会有好处。接下来，下一个矿工选择在A基础上继续记账的话，A分支就会比B分支更长，根据区块链的规则，最长的分支会被认可，短的分支会被放弃，账本还是会回归为一个，交易也只有一笔有效： -那么如果这个诈骗犯真的智商非常高，他会这么做：如果是A分支被认可（B也一样），相应交易确认，拿到商品之后，立刻自己变身矿工，争取到连续两次记账权，然后在B分支上连加两个block，就像这样 于是B分支成为认可的分支，A被舍弃，A分支中的交易不再成立，但他已经拿到商品，诈骗成功。 在B分支落后的情况下要强行让它超过A分支，其实是挺难的，假设诈骗者掌握了全网1%的计算能力，那么他争取到记账权的概率就是1%，两次就是10的负4次方。但这个概率还没有太低。 应对办法呢？建议大家在一笔交易确认后，也就是一个block被记下来之后，再等5个block，也就是等6个block被确认后再把交易对应的商品交付。这样，诈骗者还能追上的概率就几乎为0了。除非…… 如果诈骗者掌握了全网50%以上的计算力，那么，即使落后很多，他追上也只是时间问题，这就是比特币的“51%攻击”。 这就是区块链需要警惕的问题。虽然在比特币网络中，用户已经极多，全网算力总和非常大，如果真掌握50%以上，也不用靠这个诈骗了，挖矿的收益都更高。但是在小的区块链网络中呢？况且，没有50%以上的算力，还是有机会成功的，只是概率低而已。 转载自：https://www…