[email protected]:~$

  • 实现以太坊第一周 DevP2P::RLPX 握手协议

    Tags: Ethereum

    前因 《实现以太坊》是一个系列笔记。主要记叙我从头实现一个以太坊的过程,形式是每周或每两周的流水账总结,内容包括:这段时间我实现了哪些东西,这些东西是干嘛的,以太坊为什么要设计这些东西。 因为是流水账的形式,预计到之后也极有可能出现『本周打牌,什么都没写』的情况。 那么为什么又要实现个以太坊呢?难道 geth, parity, ethereumj, pyethereum, elixir-ethereum(WIP), ruby-ethereum 还不够用么? 主要考虑三个原因: Double 工资。偶尔听到老板说谁可以从头实现个以太坊,就给 double 工资。为了考验自己对公司和老板的信任,决定试一试 学习。纸上谈来终觉浅,自己实现一遍领悟到的设计和从书上看来是永远不一样的。实现一遍才可以拥有对以太坊设计的发言权。 弥补生态。上述的客户端中其实 pyethereum, ruby-ethereum 已经年久失修, elixir-ethereum 还在开发,实际能用的客户端不多。有人在尝试用 python 做另外一个 ethereum 的实现(trinity)。因为比较熟悉 ruby 生态,我决定用 ruby 实现。 因此我决定从头来实现一个 ethereum 客户端,代码放在 https://github.com/ciri-ethereum/ciri 第一周 DevP2P::RLPX 第一周,我决定从 DevP2P 组件开始,DevP2P::RLPX 是以太坊的底层网络协议套件,包括 P2P 加密通信,节点发现等功能。实现了 DevP2P,ethruby 就拥有和其他节点通信的能力,再去实现上层的协议可以直接在真实环境中测试,如鱼得水。 DevP2P::RLPX 包含通信协议和节点发现协议,还有运行这两个协议的 Server 逻辑。本周我只实现了加密通信部分。 当以太坊节点启动时,会同时监听...

  • 法币终将被加密货币取代吗?

    Tags: 加密货币

    法币会不会被加密货币取代?从比特币刚出现就一直有人提起这个话题。但大多数人属于盲目的信仰者和炒作者,很少有人真正从逻辑上去分析。 这就像是知乎上一个问题:“如何看待靠比特币实现财务自由的人”,大多数回答在讲币价下跌中拿住币有多么困难,多么的考验人性,能“拿的住”的人有多么的了不起。像这种回答只是告诉你拿的住的确很困难,但完全没有提到这样做的理由和逻辑。 能坚信一件事的人要么是有自己的逻辑、要么只是盲信者。对于后者,我认为和赌场中的赌徒一样并无可取之处。我用这篇文章来阐述下我对于法币会不会被加密货币取代的看法,而非盲目的肯定或否定问题。 先来达成一个共识,加密货币取代法币的前提是:比起法币,人们使用加密货币更有优势、成本更低。如果使用加密货币的成本小于使用法币的成本,看不见的手自然会推动加密货币的流行。 对比一下法币和加密货币的优势劣势。 _ 优势 劣势 法币 现实中的交易标准 1.汇款受政府限制 2.手续费较高(支付接口、兑换等各种手续费) 3.发行不透明 加密货币 1.汇款不受限制 2.低手续费 3.发行透明 1. 对法币的汇率不稳定 2. 难以用于现实中的交易 可以看出相较于法币,加密货币有不少优势。但也有着致命的劣势,对法币汇率的不稳定导致币价起伏剧烈(毕竟目前物价还是以法币结算),一天之内价格就会产生巨大波动,难以实际用于交易。 如果能解决币价起伏的问题,使用加密货币会更有优势。加密货币完全由分布式的节点运作,由程序来自动处理交易数据,有手续费低廉的天然优势,而银行巨大的人力成本和对利润的追求决定了使用法币进行金融操作时,其手续费绝对不会像加密货币这么低廉。政府对法币的监管也会造成法币使用成本的进一步上升,比如法币境外汇款受限,有需求的人必须付出一定的额外成本,加密货币则没有这个问题,那么在境外汇款的场景下必然会有人尝试使用加密货币,并且这种尝试会降低他的成本从而获得更多收益。 虽然有上面的优势,加密货币在现实世界的根基仍取决于能否有稳定的汇率,有了这个基础加密货币才有可能在现实中大量使用。 Dai 项目就是为了解决这个问题。 Dai is a cryptocurrency that is price stabilized against the value of the U.S. Dollar. Dai is created by the Dai Stablecoin System, a...

  • 加密货币套利现状

    Tags: 套利 加密货币 区块链

    现在谈起加密货币套利,和忽悠别人投资 ICO 一样,似乎已经太晚了(..不过真的还有人在投各种 ICO)。 但仍有两个原因在诱惑着我去尝试加密货币套利: 时不时仍有人提起套利的神话 加密货币大大的降低了普通人参与投资的门槛,研究套利对我来说是个很好的低成本入门方式。 毕竟比起做无用功,我更害怕无感觉的忽略掉身边的机会。 互联网上有很多讲套利的文章,有些浅尝即止,有些作者则更为慷慨的深入了套利的原理和各种方式。 对于加密货币来说,最简单的套利方式是利用各个交易所的差价赚取利润。比如通过观察发现交易所 A 的价格经常会比交易所 B 高,那么我们在两个交易所预先放一些钱,每次观察到 A 的价格高于 B 时就开始套利,比如 A 的比特币为 8000$,而 B 为 7600$,此时立刻在 A 卖出 x 个比特币并在 B 买入等量币,那么我们的获利就是(400*x)$。最后把低价买入的比特币转入 A,并把高价卖出的美元转入 B,这样我们就可以一直循环这个过程。只要中间的手续费小于我们套利的利润,那么我们就可以一直盈利。 套利的原理很简单,只要我们能找到有差价的交易所就可以通过程序执行,稳定赚取差价利润。 我搜索到一些能查询各个交易所差价的网站。发现加密货币交易所的价格呈两极分化,一部分交易所价格较低且差别不大,如:Gdax, Kraken, Bitfinex,还有几个交易所价格明显更高,如:Exmo, Cex, Hitbtc。这个结果对套利者来说非常好! 于是我实现了个简单的模拟套利程序,不断的从不同交易所抓取价格判断差价,并根据当前市场的活跃订单判断套利收益。跑了几天数据,在低价和高价交易所之间经常可以捕获到 2% 甚至 3% 的差价,根据捕获时的买单卖单金额,每一笔可以获得 50 ~ 70 刀的收益(每次最多套利 0.5 ETH)。于是我获得了大笔收益,过上躺着赚钱的日子,把这个方法分享出来希望大家走上共同富裕。 开个玩笑。数据是真的,但我感觉模拟不一定十分可靠,有可能下单慢了没有匹配上,也有可能频繁的套利会缩小预期差价减少收益,还有可能手续费比假设的千分之五要高。...

  • 高性能 MySQL 驾驶笔记

    Tags: mysql

    聊天群里看到有人复习 MySQL 准备面试,想起之前整理过《高性能MySQL》的笔记,倒是很适合面试前的准备 内容大部分是整理自《高性能MySQL》第三版,外加少量的个人经验 Schema Tips: Varchar 存储时会自动调整长度 MySQL 会根据 Varchar 指定的长度预分配空间,所以用尽量小的值效率会更好 Varchar 长度变大时会造成碎片和性能问题,MySQL 需要重新为其分配空间 文本类型数据可以考虑是否使用 Binary,性能会比文本好 关联键用 int 效率最高 主键小的话表也会小,所以用 int 做主键可以提升性能。可以考虑内部 int, uuid 外部的“双主键”设计 TimeStamp 效率更高,4 个字节,带时区信息,储存为 unix time 默认不为 NULL。DateTime 则无限制,用数字存储,时间支持到 9999 年,效率不如 TimeStamp IP 应该使用整数存储,使用 MySQL 函数互相转换 Columns 过多会引发性能问题,因为 MySQL 服务层会负责转换引擎层的数据 索引: 一般使用 B+Tree,可以控制在 log 时间内...

  • 从零设计软件

    Tags: 读书 想法

    程序的设计是一个明确的步骤 - 代码大全 从零设计软件,对程序员来说似乎不应该是件难事,毕竟程序员的工作就是设计软件并写代码去实现。 但随着项目规模变得庞大,架构师、产品经理、设计师等角色加入了软件设计的流程,这些角色以自己的专业技能聚焦某一项的设计工作。软件设计被拆分为多个流程,这对于项目来说当然是好事,更多的专业性会让产品的某些特性更加出色。但设计工作的划分难免会使部分设计者一叶障目,难以从全局来观察项目,尤其是刚步入工作的人。 很多人说自己喜欢编程喜欢写代码,但“写代码”这个词非常容易误解,编程 = 设计 + 写代码,而不仅仅是写代码。 随着程序员的成长,应该逐渐把编程的重点放在设计,如:接口、API、算法、模块划分、架构等。并更进一步了解软件的整体设计,而不仅仅是编程这一环节,了解软件的整体设计会让你分清优先级,知道什么该做、什么是多余的,下一步该做什么,软件的哪些目标达到了、哪些没有。这些意识对于提高效率至关重要。掌握这些意识,也就是有了大局观。 如果是自己做过一款产品(Side Project),会对软件整体的设计有更好的把握。很多程序员做 Side Project 时的误区是会从代码开始,冒出新想法时就不断的堆砌代码,从而导致越来越复杂,最终放弃。 这种误区是程序员在工作中养成了习惯自底向上的解决问题,而没有掌握大局,自上向下的分析问题。 从零设计软件,需要自上向下的思考,先把键盘丢开,拿起笔和纸,思考下面问题的答案: 1. 软件的目标是什么? 这个问题很简单,却直指核心。可以认为整个软件就是对这个问题的答案。 如果对这个问题没有明确答案,则需要对你的模糊想法进行大量的 Research,直到了解相关领域,得出了更明确的答案。 2. 设计软件原型(MVP) 能达到目的的最简设计。用简单的语言和草稿图来描述。 3. 细化业务逻辑、流程 根据上面的设计稿罗列功能点,用户使用软件的交互过程,流程等。 4. 划分模块组件 根据功能点来设想需要哪些程序组件、模块。 5. 制定模块接口 对上一步中的组件、模块制定详细的接口。 6. 写代码 最终实现的步骤。 经过这几个步骤,我们进行了自上向下的思考,完成了从零设计软件。

  • 保持谦逊、努力、平和

    Tags: 想法

    傲慢、嫉妒、愤怒、怠惰,或许皆因目光短浅? 睡前翻知乎,看到有人列举了爱因斯坦、费曼、薛定谔、杨振宁等人年轻时的照片和成就。突然意识到教科书上的人物在自己的年龄段已经作出了影响全人类的贡献。这触发了我下意识的思考,从小把他们当成偶像,现在已经超过了他们拥有成就时的年龄,而我和大多数人也还是一事无成。 年轻人的嫉妒和愤怒往往来自于对比,从小时候中国式教育的分数竞争,长大后的出身、教育经历,工作中的职级和薪水,中年人的房子和车。社会中鄙视链环环相扣,而这条鄙视链同时也传播着傲慢、嫉妒、愤怒、怠惰。 傲慢蒙蔽人的双眼,对别人的鄙视与嘲笑远比提高自我来的轻松,这样又使人陷入了怠惰,当遇到阻力或鄙视链上层的嘲笑时,由于心理的巨大落差心生嫉妒与愤怒。四种恶行使人焦虑,难以前行,只求在鄙视链中获得些许快感。 看着爱因斯坦、费曼、薛定谔、杨振宁等人年轻时的成就,感觉自惭形秽。 一事无成却傲慢,渴望成就却怠惰。 人应该 Focus 在自己的提升、而不是与他人的对比。竞争意识本来是为了驱使人提升自我,却被教育家和世人滥用导致更大的问题,竞争可能短期会带来使人努力的效果,但其本质是用 嫉妒、愤怒 迫使人努力,而给胜者 傲慢、怠惰 的奖赏。由恶行来使人前进,长此以往本末倒置,使人沉沦于恶行的奖惩,而忘记了提升自我的本意。 谦逊、努力、平和,提醒自己牢记三种善行。 谦逊的去学习新的知识和观点,努力的工作而非追求虚名小利,平和的审视自己,认识到自己的进步而快乐。 哪些历史人物的实际年龄与大众印象中的相差很多,使得人们观感错乱? 七宗罪 中国人如何经营自己

  • PUMA 实现简要分析

    Tags: Ruby

    之前在 绿色线程是如何提升服务器并发性能的 一文中描述了绿色线程的原理。并且讲了我的计划:使用 Discourse 来 benchmark 绿色线程对并发性能的提升。经过一番折腾后在 LightIO 下成功运行了 Discourse 的 benchmark(折腾很久后发现需要将 Discourse 使用的 hiredis gem 换成纯 ruby 实现的 redis client),但结果却是使用绿色线程和不使用时性能表现差不多。 我推测性能相差不多的原因是 Discourse benchmark 使用了 thin 服务器,thin 是个单线程服务器,当然无法发挥出 LightIO 绿色线程的威力。那么换用 Puma 呢?来看一看 Puma 源码,Puma 实现的非常简单。 从 https://github.com/puma/puma Readme 中可以大概了解 Puma 的实现方式。 Puma 分为 Single, Cluster 两种模式: Single 是单进程多线程模式,这种模式使用 ThreadPool 处理请求。...

  • 绿色线程是如何提升服务器并发性能的

    Tags: Ruby

    LightIO 是去年末开始写的一个库,给 Ruby 提供了低廉的绿色线程,并且可以通过 monkey patch 替代原有的 native thread。这样服务器端可以使用大量绿色线程,用较小的消耗来获得更好的并发性。经过一段时间的开发, LightIO 已经比较完善,并且 monkey patch 后可以成功和 Rails 、Puma 等共同使用。于是我开始考虑如何测试服务器使用 LightIO 后的性能,毕竟能真正的带来性能提升才有继续开发的动力和必要。 在性能测试前要考虑下绿色线程的原理,以及为什么可以带来性能提升? LightIO 通过包装 Ruby 标准库的 Fiber 来提供绿色线程(在 LightIO 中叫 Beam),并维护一个绿色线程的调度系统。 这个『调度系统』并不复杂,简单来说只有三步: 检查 Beam,如果有 Beam 可以执行则执行。 Beam 执行到 blocking 操作时,使用 nonblocking 接口替代,并挂起 Beam 检查完成的 nonblocking 操作,如果有则恢复挂起的 Beam。 从步骤中可以看出,绿色线程帮我们节省的是『blocking 操作』时的等待,遇到 blocking 操作时调度器会尽可能的调度更多的绿色线程(可以认为这就是并发性的提升)。从这点来看效果和 callback...

  • Ruby 又要添加绿色线程了 Thread::Green

    Tags: Ruby

    翻到了 ruby-lang 的这个 issue,Eric Wong 给 Ruby 提了一个绿色线程的 PR https://bugs.ruby-lang.org/issues/13618 总结下: Eric Wong 给 ruby 增加了可以自动调度的 fiber,暂命名为 Thread::Green。就是类似 go 的 goroutine 这样的轻量级线程 Queue, SizedQueue 等用于同步的类是可以和 Thread::Green 一起使用的。意味着现有的 WebServer 换成 Thread::Green 很简单可以迁移 Matz, ko1 等大佬纷纷拍手称赞,(说不定很快就能用上了) 之后 ruby 可以说摆脱异步编程模型了,直接起 Thread::Green 然后用 blocking IO 就可以和 node 的 callback hell 怼一怼 对‘应用级别’开发者意味着 Web Server...

  • 2017 书单总结

    Tags: 读书

    写了些 2017 印象深刻的书,有些是重读,有些则是 2017 年才感悟深刻。 《毛泽东选集 一》 以前认为崇拜毛泽东的人不可理喻,读了这本书认识到他的思想和意志力的确让人佩服。毛泽东用精准的眼光去分析问题,直指本质,多年不动摇的坚持并证明。而其总结的方法论就是 “了解、研究,研究透彻自然有解决的办法”,让人感到理所当然,又感到恍然大悟,大道至简,知易行难啊,整本书用我们熟悉的历史来反反复复的描述这一方法论的实践。你可能熟悉历史但不熟悉其背后的时局战略,你可能熟悉时局战略但不知其因,你看了这书后就都懂了并且会很佩服毛泽东。在当今社会,真的很难相信一个人可以毫不怀疑的坚信理念这么多年,并直至成功。 《漫步华尔街》 在读这本书前根本搞不懂股票、基金、指数基金。这本书清晰明确的阐述让我相信定投指数基金,并且按照此方法定投一年获得了年利率 10% 以上的收益,所以推荐给其他不懂理财的人。 《自私的基因》 非常推荐,看完后对族群的竞争,基因的演化有了更好的理解。书中有大量对不同物种,不同种群,不同性别间竞争策略的阐述,用类似的方法分析如今的社会现象似乎也行得通。和《枪炮、病菌与钢铁》的作者风格很像,忘了是哪个作者在新几内亚群岛养鸟了.. 《高性能 MySQL》 后端程序员必读,浅入深出,明白了很多以前模糊的地方。 《被讨厌的勇气》 自我怀疑、抑郁、焦躁的话可以读一读,作者用阿德勒心理学一个个的击破病因。看起来像成功学(尤其是书腰),读完感觉还是有不错疗效的。 《火凤燎原》 隔了几年重读,仍然感觉惊奇。 一本讲三国的漫画,颠覆历史与演绎。你认识每个人物,但你又不熟悉每个人物。你知道故事的结局,但是永远也猜不到它是如何发生的。董卓入京到官渡之战大约十年,作者现实中也画了十年(现在已经画完赤壁了),可见用心。