学习区块链的基础资料
《猥琐发育成区块链开发者》普林斯顿的《Bitcoin and Cryptocurrency Technologies》课程《精通比特币(第二版)》
几种共识算法
达成共识的英文原文是 come to consensus。达成共识以后,也未必代表数据是完全一致的(Raft 算法中 leader 发出 append log 的 commit 命令即算达成共识?但如果中途数据丢失,则还是会有子节点数据不一致)。 在分布式环境下,多个系统协同工作的效率,受制于系统交叉点的性能。在需要达成分布式共识的场景下,分布式共识算法在保证系统安全性的同时,限制了全系统横向扩展的性能提升。 根据环境的不同,可以应用不同的共识算法。 在完全互信的环境下-私有链、私有的分布式数据库,节点之间可以使用 Paxos 或者 Raft 这种 leader 相对固定的算法。 在有限互信的环境下-联盟链,可以使用 PBFT。PBFT 算法是依据确定性的投票(可能是漫长的投票,也可能进入死循环)达到确定性一致的算法。 在没有互信的情况下-公有链,可以使用 POW/POS/DPOS/POA。这类算法是基于概率得到正确的最终一致性,性能比 PBFT 要稍微好点。 最好的共识算法应该模块化,例如 Corda 中的 notary,Hyperledger fabric 中的...
Vue 值得注意的小知识点
this.$el.querySelector(‘#map’) 只能查找第一个 dom 以内的 dom 节点,不包括当前的 dom。 在 webpack:// 这个域下可以看到可调式的 vue 文件。
Spark Standalone 模式启动的全过程
把这个事情做成一个小 routine,免得以后每次都要看英文文档来搭 dev 环境 准备工作下载安装包,解压并进入根目录。 ./sbin/start-master.sh。看 jps 果然已经有了一个 Master 进,文档里面说会打印出 spark 的 master url,但没打印出来。就去默认的http://localhost:8080上看即可: 12URL: spark://magicliang:7077REST URL: spark://magicliang:6066 (cluster mode) 这个6066在本地 telnet 不通,也是很神奇。 把这个 URL 拼接成 worker 的启动命令./start-slave.sh spark://magicliang:7077,然后可以看到以下这张图: 文档里的给出的定义 worker 节点的方法:在 Spark 根目录下定义一个 conf/slaves 的文件,每一行写一个主机名。如果这个文件不存在(就是我们现在这个状况),则 worker 就会全部启动在 localhost 上。而 master 是通过 ssh...
DAG 执行框架优于 MapReduce 的地方在哪里?
有个同学问我什么是 DAG 框架。我感觉隐隐约约听过,但又讲不清楚它的概念。 上网搜了一下,我们常见的新大数据执行框架如 Spark、Storm,还有一个我没听过的 Tez,都算 DAG 任务执行框架。他们的主要优点是,可以用 DAG 事先通晓整个任务的全部步骤,然后进行转换优化。如 Tez 就可以把多个任务转换为一个大任务,而 Spark 则可以把相关联的 Map 直接串联起来, 免得多次写回 hdfs(看来 hdfs 也很慢)。传统的 MapReduce 框架为什么不能理解这种优化空间的存在,在任务运行的时候好像一个盲人一样,是个很有意思的话题。 Quora 上的一个相关的问答。
风险问题
风险可能有收入也可能有损失。风控先是管理,然后是控制。 精细化管理,平衡点。 信用风险(Credit Risk)欺诈风险(Fraud Risk)操作风险(Operationl Risk)伦敦乌龙指?现金流风险(Liquidity Risk)市场风险(Market Risk)监管风险(Regulator Risk)声望风险(Reputational Risk) Exposion 担保套利 美国三大征信局 Experian、TransUnion、Equifax。美国百分之八十五的人的信息在民间征信局。 美国的征信分数 FICO 由五个部分组成。 中国人会抹掉五年期的征信历史。 Payday Loan 是没有年化上限的。
比特币小细节
收款地址是公钥的hash。 区块结构: 数据项 描述 长度 Magic No 魔数 总是 0xD9B4BEF9 4 字节(定长) BlockSize 区块大小 到区块结束的字节长度 4字节(定长) BlockHeader 区块头 包含六个数据项 80字节(定长) Transaction Counter 交易计数器 正整数 VI=VarInt 1-9字节(变长) BlockHeader 区块头 包含六个数据项 80字节(定长) Transactions 交易 交易列表(非空) 由Transaction Counter 描述的长度(变长) 由此表可见,只有交易计数器和交易明细列表是变长的。 比特币使用 SHA256 算法,它的结果哈希值大小为 256 位。也就是说,只要输入超过2的256次方个数,就一定会发生碰撞,即使只有2的255次方个数,也有百分之九十九的几率发生碰撞(为什么?)。 当前(这一百年内),每个区块都至少包含一个...
什么情况下 Scala 应该省略 Return 关键字
一个很有意思的回答。 总体而言,如果我们能够分得清什么 last expression,我们就能推导出和编译器一样的返回类型结果。否则,我们应该显式地加上 return,这样既指定了实际返回类型,也指定了控制流上的返回点。
以太坊的硬分叉
有四次计划内的软件升级,每次都是硬分叉:Frontier,Homestead,Metropolis,Serenity。 有一次意料之外的分叉(DAO 事件),制造出 ETH 和以太经典两种货币。 每次分叉都会造成矿工的迁移。旧链会因为流失算力而丧失安全性。 大都会分叉本来打算引爆难度炸弹,迫使矿工们从 PoW 共识算法移动到 PoA 共识算法,让以太坊进入冰河时代。但这个难度炸弹的引爆被延后了。 大都会同样引入了一个 PoS 的早期实施,Casper共存 算法允许每一百个区块里会有一个 PoS 区块。关于 PoS 算法,Vitalik 的解释是: 想象现在有 100 个人围着圆桌,其中有一个人拿着很多张纸,每张纸记录着很多笔历史交易信息。第一个人拿起笔签完后递给第二个人,第二个人也做出了相同的选择,如果大多数人做出了相同的选择,即都签署了同一张纸那么每一个参与者会获得1美元,当你做出和绝大多数人不同的选择时,那么你的房子就会着火!...
Scala 泛型中的协变(covariant)与逆变(contravariant)符号
看到这个问题《+- Signs in Generic Declaration in Scala》下面有一个很有意思的答案: “+” and “-“ mean covariant and contravariant types respectively. In short, it means that: PartialFunction[-A1, +B1] <: PartialFunction[-A2, +B2] only if A1 :> A2 and B1 <: B2, where <: is subtyping relationship. 简而言之,-意味着逆变成立,+意味着协变成立。