1,pointer指向的是本地内存的地址,将其发送到别的计算机便失去了其原有的指示意义,in that case,hash pointer 如何在区块链中进行传播?(在 BTC system 中,很多地方都用到了 hash pointer,比如,在 blockheader 中 就存有 previous blockheader 的 哈希指针。在此,引出一个问题,hash pointer 一般指的是 本地内存的地址,四散于网络中各个 node,如何 通过 blockheader 中 所存的 hash pointer of previous blockheader 找到 previous block 在 network 中的 具体地址?) 在实际的BTC system中,只有 hash,没有 pointer,每一个 block 都已 (key,value) 的形式 保存在数据库(常用的database:levelDB)中。key 为 block 所对应的 hash 数值,value 为 block中的具体内容。system中的nodes,可以在 database 中 找到blockchain中最后一个block所对应的 (key,value),继而通过value获取该block的具体内容,包括指向previous blockheader 的 hash值(key),通过这种方式,nodes可以将 区块链 上 所有的 block 都 找出来。
下图为 blockheader的数据结构,有图可以看出,blockheader 中 存储的 previous blockheader hash 实际是一个 int ,对应为 database 中的 key 值。
hash pointer的性质 保证了 整个 区块链 中的 info 是不可篡改的:每个block 记录的都是其 previous blockheader 的 hash,当一个block上链后,随意改动 previousblockheader的值,会直接影响到 H(blockheader),从而使得其原本legal 的block ,瞬间变得不合法。此外,一个block中,只存有 previous blockheader hash,并未存储自身的hash,因而,其自然也不能随意对其block hash 进行改动。
2,区块恋:lovers用blockchain作为两人的爱情见证: 七夕时,情侣在BTC system中注册一个账户,共同购买一笔BTC,然后各自保留该账户 一半的private key,如果有情人终成眷属,那么两人可以将private key 拼在一起,将这笔BTC取出。如果 两个人不幸分手,那么 这笔BTC将被永久保留在blockchain上,作为二者的爱情见证。 将这种behaviour推广到 公司合伙人,每个合伙人均掌握private key的一段,当需要 withdraw 时,只有 将 所有合伙人的 private key片段拼接在一起,才可顺利提取。 此种 behaviour存在很大的问题,首先,如果其中任意一个合伙人丢失其片段,都会致使该账户中BTC会永久封存在blockchain中(UTXO)。这对矿工来说是极不友好的,因为UTXO存在矿工本地,会耗损其大量内存。 二者,privatekey 的 安全性,主要通过其长度来保证,如果其中几个合伙人存了私心,想要私吞这笔钱,那么破解 privatekey的难度系数会大幅下降(一个privatekey 占 256bits,即便用 全球的计算资源来暴力破解该privatekey,也很难成功。但是,如果仅需破解 一半的privatekey,则破解难度 会 直接 降至 2^128,difficulty呈指数下降)。 如果在实际应用中,真涉及到需要多人同时同意的情况下,才可withdraw,可以 使用 多重签名 的方式,来实现 该操作。
3,关于 分布式共识 有很多不可能结论,那么BTC system是如何达成分布式共识的? 严格来说,BTC system并没有达到公式,因为 一旦出现 forking attack,原来被认可的block便会被推翻。而分布式系统 共识的达成,要求系统一旦达成共识,便不可更改。 理想很丰满,现实很骨感:理论往往与实际存在一定距离,在理论中不可能的事物,往往可以通过实际中的一些操作 变得可能,比如,若干年前, 有人曾提问:如果一台计算机无法连接到 远程服务器,如何知道 无法连接 是因为 网络堵塞,还是 因为 远程服务器 死机? 按照理论来说,根本不可能知道 导致失联 的 原因 究竟是 由于网络延时还是服务器死机。 但是,在现实社会,远程服务器 均有 管理员 负责,如果真发生 无法连接的问题,开发人员可以通过拨打 管理员电话,请其 确认 服务器 当前状态。又或者,可以通过电话线拨号的方式 连接远程服务器,如果 仍然连接不上,则很大概率,该服务器确实死机了(网线 和 电话线 同时拥堵 的 情况 很少见)。 so,虽然知识很重要,对知识的一知半解却很致命。再者,不要让固有思维限制了你的想象! 同时,真心觉得 基础扎实 很重要,只有打牢基础才能实现创新!
4,BTC system 中的 矿工 为什么要 幸幸苦苦 挖矿,什么是他们 挖矿 的 动力?(BTC rarity) BTC system中的 miner 进行 mining 主要是 为了 获得收益。只有当 mining 获得的收益 大于 开销时,其 对于 miner 才具有 吸引力。 BTC system 要想 吸引 miner来mining,要么 降低挖矿难度,减少矿工开销,要么 增加 挖矿奖励,提高 挖矿收益。 在BTC system 刚刚出现时,mining 相对来说比较容易,且 block reward 也较高,为 50 BTC,这种设置其实是很合理的,因为对于 初代miner来说,mining 风险较高,且BTC system 需要通过这种设定 来解决 system 冷启动的问题。 随着 BTC system 的兴起,挖矿难度在不断加大,且 block reward也日渐减少。system规定,每出 2000 个 block,block reward 便会减半,这种巧妙的设定 使得 system 中 BTC 总额 是 恒定的。这种 setting 确保了 BTC 的 rarity,但是,这对于一个 货币 来说,并非好事,一个好的 货币 需要有 通货膨胀 的 属性。举个例子,从古至今,黄金 都被视为一种 rarity,价格居高不下,这是因为 黄金 是一种 稀缺品,其 总量是有限的,并不会 与日俱增。如果,你在几百年前 黄金相对便宜时,囤积了 很多黄金 直到现在,那么你将非常富有,且,即便 现在你每天 吃喝玩乐,你身边的人 努力奋斗,其拥有的财富也可能一辈子无法赶超你。因为,黄金的 市值 随着其 稀缺性 会 不断增加,即便你每天不工作,其 增值属性 也可能确保你 不用工作,收入便 远超 你周边的人。这种 形式 就和 北京的房价一样,如果在几十年前 你够一套房,几十年后的今天 可能 价值 翻倍。而 同龄的人,可能 为了 购房 而 成为 房奴。 而 好的 货币 之所以 因 具备一定的 膨胀性,是因为,只有这样,才可以 保证 人们可以通过努力而实现 阶级跃迁。货币 不会 因 存储 而 增值,甚至 可能贬值,其这种属性 可以 保证 努力的人 可以 获得 相应的 回报,是一种 相对公平的 实现形式。
在古代,曾用 黄金 作为 流通货币,后来被废弃了,因为,黄金的 总量/增长速度 远远比不上 社会财富的增长速度,如果 将 黄金 定为 法定货币,会导致,社会中的所有财富 都 集中 到了 少量的黄金身上,随着时间的推移,一定重量的黄金 所具有的社会价值 会 越来越高。就像是 北京的房价,如果一直 居高不下,保持疯涨态势,那么对于 绝大多数的普通人来说是非常不公的,因为,这种现象 将 导致 个人奋斗 变得 毫无意义,同时,将拉大社会的 贫富差距。一个积极向上的社会 是 应该 杜绝这种 情况出现的。 货币 的 通货膨胀性,可以 消除上述 这种 不公现象,使得 社会中的 每个人 均可通过 努力 获得 应有的 回报。
BTC 就像是 黄金,虽然价值连城,但是 不宜 作为 货币 流通。不过,对于 miner来说,只要 保证 mining 有足够的利益可图即可,miner在 system中 获得收益的 方式 有2中:block reward,也是 system中 唯一一种 “造币” 的形式;transaction fee,miner可以通过记账,而在每笔 transaction中 抽取一定的 transaction fee。
如果对于这部分内容感兴趣,可以 阅读 “货币金融学” 的 一些相关知识。
5,像 BTC 这样的 加密货币,是建立 在 密码学的 基础之上的,如果 量子计算 发展起来之后,BTC 这样的 加密货币 会不会变得不再安全,人们 破除 private key(let alone 日常的账户密码)的难度 将 大幅 降低? 虽然 量子计算机 的 计算能力 非常 强大,但是,其目前 仍处于 研究阶段,距 实际使用 还有 很长的 一段距离。在 BTC system 的 有生之年 不一定 能 投入使用。即便,量子计算机 真的 被投入使用,真的 具备 破坏现有加密体系的 实力,其 首先 冲击的 也是 传统金融业,比如 :网上银行,网上支付,网上转账。即便 其 真的对 encrypt digital coin 产生冲击,在 现实社会中 ,这些 数字货币 占据的 市场 总份额 很小,也不会 造成 社会的动荡。而且,随着 量子计算 的发展,也将 对应 产出 量子加密算法。所以,上述这种担忧 实际上是多余的。 此外,BTC system 中,并未将 public key 暴露于 网络,而是将 public key 取hash 后,得到一个地址。BTC system 采用的是 “非对称加密体系”,其只能 通过 privatekey 推导出 publickey,所以,你只要将自己的 privatekey保管好,就不用担心 publickey会泄露。如果 有人 想从 你的 Hash(publickey) 推导出 你的 publickey,则 需要 对 该 hash 进行 逆运算,而 由于 hash function 本身会 decrease info 的 部分 数值意义,因而,这种 逆运算 本质上不可能。
加密 和 hash function 是2种性质截然不同的操作,加密,是为了 隐藏信息的真实内容,日后 还需解密,因此,其实现过程 需要 保证 info的完整性,而 hash function 是不可逆的,在 hash(info)的过程中,一般都会造成 info 部分数值信息 的 丢失。 hash function 实质像是一种 信息压缩技术,比如,如果将 北大图书馆中所有 digital info 通过 SHA-256 function 进行 压缩,那么 压缩后info 势必会丢失部分原来内容。
BTC system中,只有在 进行 withdraw 时,你才需要 写入 publickey,假如 有人 在你 input publickey 时,监听到了你的 publickey,那么 如果 他想 将你账户中的BTC转入他的名下,则 必须 抢先于你,将这笔 withdraw transaction 写入 block 中,否则,一旦 你先写入 该 transaction,他在 写入该 transaction 时,将被视为 illegal transaction(假设,你将publickey中全部BTC 都withdraw,那该 publickey中将没有 unspent BTC,如果 他 在执行 该笔 transaction 时,将被 fullnodes 认为是 illegal double spending,而不予通过)。要实现 抢先于你 将 transaction 写入 block,需要在几秒钟之内 将 privatekey 破解,即便 其 用 量子计算 进行 暴力破解,这种可能性也是为0的。
从安全性角度来讲,为了保证你所拥有的BTC不被盗取,最好,每次withdraw transaction后,都弃用该publickey,或者将剩余的钱转入你的其他账户,否则,很可能在日后,被有心人 破解其 对应 privatekey。
|