刚接触区块链的新人会被一大堆新概念吓倒:
比特币地址、区块、区块高度、去中心化、算力、确认数、难度调整、挖矿、矿工、矿池、哈希、分叉、工作量证明、双重支付、私钥、公钥、交易、交易手续费、钱包等等
普通人在短时间内很难理解这些概念,但程序员们相当有优势,他们有计算机理论知识,理解这些概念相对容易一些。
2017年10月,我写了一本电子书《区块链生存训练v1.0》,尝试用简单的语言、形象的类比让从未接触过区块链的小白,能够逐个理解一个又一个的新概念,从而慢慢地进入到区块链的世界。
2018年2月底,我与几位朋友一起将书的内容升级到2.0版本,现在已经放在网上公开下载。
下载链接:
https://pan.baidu.com/s/1QmENCssdW1z69C98hdoIeA
提取码: vggd
随着研究区块链内部原理的深入,一直以来我想写一本给程序员看的区块链书籍,尝试用C#代码说话,当出现一个新概念的时候,我尽可能地给出一些源代码,通过分析和跟踪源程序,你可以更深刻地把握比特币和区块链的基本原理。
内容准备发在掘金小册上,定价69元,小册的名字暂定《用C#代码准确理解区块链的20多个基本概念》,如果哪位朋友有更好的名字,也欢迎留言。
小册的大纲(可能会调整):
- 开篇及比特币钱包Bitcoin Core准备
- 最最基本的概念 -- 区块(Block)及区块高度(Block Height)
- 可分割性及公开性 -- 可用的API一大堆
- 创世区块(Genesis Block) -- 找出中本聪留下的那句话
- 稀缺性 -- 为什么比2100万个少那么一点点?
- 私钥(Private Key)、公钥及比特币地址(Bitcoin Address) -- 地址重合了?
- WIF与助记词 -- 私钥记不住怎么办?
- 哈希(HASH)及SHA256 -- 可以搞一个装逼的抽奖程序
- 数字签名(Digital Signature) -- 如何证明你就是中本聪?
- 交易(Transaction) -- 上亿的资金转移只需200个字节?
- 交易手续费(Transaction Fees) -- 小心别给矿工送钱
- 钱包软件(Wallet) -- 全节点数据已经超过200GB
- Bitcoin Core的API -- 可以控制钱包和交易的每一处细节
- 去中心化(Decenteralization) -- 全世界的全节点钱包软件如何分布的?
- 工作量证明Pow、矿工(Miner)与矿池(Mining Pool)
- 创币交易(Coinbase Transaction) -- 你也拥有了铸币权?
- 计算目标与难度系数difficulty -- 如何每两周就调整一次难度?
- 算力、哈希速率(Hash Rate) -- 看看你的机器与比特币矿机相关有多大?
- 交易确认数 -- 为什么需要6次确认?
- 未花费交易输出(UTXO) -- 全世界有多少人拥有超过1个BTC?
- OP_RETURN誓言墙(不可篡改性) -- 你敢把情书写在区块链上吗?
- HD钱包 -- 分层确定性钱包是个什么鬼?
- 比特币的脚本体系 -- 为什么用逆波兰表示法的基于堆栈的语言?
- 交易的二进制表示 -- 如果你有足够的耐心,手算也可以生成一笔正确的交易
- 重放攻击(Replay Attack) -- 夺走别人的币?
- 区块和交易信息的一次全面解读
- 未来已来,只是尚未流行
适宜人群
本书的预期读者是没有任何区块链知识的C#程序员,当然,如果你已经是一名智能合约的开发者,本书对你也会有所帮助,通过书中丰富的C#源代码,可以让你更准确地理解比特币和区块链中的各种概念。
如果你不是一名程序员,本书可能不适合你,建议你先阅读《区块链生存训练》的1.0或2.0版本的电子书或者其它入门书籍。
阅读之后,你可以掌握比特币和区块链的20多个基本概念,关键的是你可以用程序生成比特币地址、进行消息签名、生成交易、设置交易手续费、在区块链上刻字,甚至自己写个钱包软件等等,还为下一步进行以太坊智能合约编程打下坚实的基础。
你需要准备
Windows 7 / 10(64位)电脑一台
Visual Studio 2015或2017开发环境(C#)
安装好Bitcoin Core钱包软件
书的大部分素材都已经写好了,只是源代码的整理的工作量还相当大。
如果你是C#程序员,且对本书感兴趣,欢迎参与内测。
微信联系我:SLOFSLB
为了证明你是一名C#程序员,请告诉我下面这段代码的输出结果:
代码语言:javascript复制string url = "https://blockchain.info/block-height/0?format=json";string block = GetUrl(url);
JObject o = JObject.Parse(block);string script = (string)o.SelectToken("blocks[0].tx[0].inputs[0].script");
byte[] bs = new byte[script.Length / 2];for (int i = 0; i < script.Length; i = 2){ bs[i / 2] = Convert.ToByte(script.Substring(i, 2), 16);}string text = Encoding.ASCII.GetString(bs);Console.WriteLine(text);
--- END ---