1.11.21.2.11.2.21.2.31.2.41.2.51.2.61.2.71.2.81.2.91.31.3.11.3.21.3.31.3.41.3.51.3.61.41.4.11.4.21.4.31.51.5.11.5.21.5.31.5.41.5.51.61.6.11.6.21.6.31.6.4TableofContents介绍I.简介1.前言2.为什么是区块链编程而不是比特币编程?3.为什么是C#?4.预备条件5.本书众筹6.补充阅读7.图标8.许可:CC(ASA3U)9.项目设置II.比特币传输1.比特币地址2.交易3.区块链4.“区块链不仅仅是比特币”5.支付比特币6.作为真实性验证方法的所有权证明III.关键的存储和数字生成机制1.足够随机了吗?2.秘钥加密3.秘钥的生成IV.其它类型的所有权1.P2PK[H](向公钥付款[Hash])2.多重签名3.P2SH(向脚本哈希付款)4.灵活机动性5.使用TransactionBuilderV.其它类型的资产1.颜色币2.发行一项资产3.传输资产4.单元测试21.6.51.6.61.6.71.6.85.李嘉图合约6.流动的民主7.烧钱和声誉证明8.存在性证明3C#区块链编程NicolasDorier编著NBitcoi贡献者,.NET比特币框架BillStrait联合编著Billd实验室创始人41.前言AynRand在FountainHead与我有共鸣的一篇文章GAILWYNAND是享誉世界富有魅力的木偶大师,而HOARKHOWARD是建筑设计行业的领军人物,他们在一起言谈甚欢。GAIL发现与HOARK一起的时候,有种奇妙的放松的感觉,不知道为什么,他于是就问对方。WYNAND问:“HOWARD,你曾经恋爱过吗?”ROARK转面直视着他,不假思索地回答:“我现在就在谈恋爱。”“但是当走过一幢建筑的时候,你觉得还有什么比它更棒的?”“棒得多,GAIL”“我正在思考人们说的一句话,世上无快乐。看看他们多么艰辛地寻找生命中快乐的人。看看他们是如何孜孜以求的。为什么生命止于平淡呢?想想可以通过什么权利,任何人都可以因任何原因人存在于世上,而他自己的快乐除外?人人都需要它,而且人人身上的每一部分都需要它。但是人们从来没有找到它。我在思考为什么。有人喝了酒然后说不知道生命的意义。这是我特别看不起的一部分人。寻找更高级意义或者‘普世目标’的人,不知道为了什么而活着的人,嘟囔着必须需找自我的人。你可以在周围听到尽是他们。那些好像是我们时代的标准陈词滥调。每一本书你打开,都在口沫横飞地自我忏悔。好像忏悔是一件高贵的事情。我却认为它是最令人羞耻的事情。”“看,GAIL。”ROARK起身,伸手折断了一棵树上的粗大树枝,双手紧握,一只手在一边;然后,他的手腕和指关节将树枝压弯,慢慢地变成一个拱形。“现在我可以把它做成任何我想要的东西:一张弓,一支矛、一根手杖、一条扶手。那就是生命的意义。”“你的力量?”“你的工作。”他把树枝放到一边。“世间提供给你材料,你从中制造东西...”我想区块链就像是那根树枝。对于局外人而言,感觉像是令人厌烦而毫无用处的数字集合。对于程序员和企业家而言,那就是绝佳的原材料,可以实现我们的梦想。我们赋予它意义和目标。你需要先要了解木材的特性,然后才能从一节树枝制造一张弓、一支矛或者一根手杖,同样地,你也需要知道如何编程实现区块链。我希望,你以自己的技能和智慧,将会发现可以在多大程度上利用这些看上去一无是处的数字集合。我还是需要提醒一下你:学习区块链就好像在黑客帝国中吞下红药片。你将会发现已经无法自已,想尽快辞职转而全职专攻区块链。本书将带你从区块链的基本应用走向高级应用。它不会教你如何使用API(比如比特币核心提供的RPCAPI),但是它将教你如何编写这样的API。拾遗:中本聪曾经把比特币描述成“令人厌烦的灰色。”5面向API编程可以帮你快速实现应用,但是开发者的创造性三就被限于API了。通过完整理解区块链,开发者将拥有能力充分挖掘开发区块链的潜力。62.为什么是区块链编程而不是比特币编程?区块链是金子,比特币是珠宝。我们不想把比特币比作金币,更愿意说它是珠宝。因为金子的第一个杀手级应用就是珠宝。金币来得更晚一点。你不要被蒙了,认为比特币是有瑕疵的,而区块链是珍贵的。如果金子是珍贵的,你会把金项链扔掉吗?区块链是因为比特币而建立并发展起来的。随着区块链价值的增加,更多的比特币也将会应用于区块链,从而增加了对比特币的需求。你的应用是否使用“比特币作为一种货币”的特性取决于你自己的决策。区块链是原材料,比特币是燃料。每次人们认为这种燃料也可以作为交易的媒介时,比特币作为货币的特性就出现了。相对于交易价值,你可以让区块链做得更多。你甚至不需要认为它是货币。我们将在本书中向你展示如果使用作为货币的比特币,但那不是全部。73.为什么是C#?.NET框架在公司很受欢迎。相信对于创业公司和爱好者而言也是理想的工具。.NET框架开发的代码可以在IOS、Android、Windows平板/手机、桌面、服务器以及嵌入式设备中运行。从编译器到运行时内核全部都是开源的微软创业企业扶植计划允许创业公司使用所有微软工具,包括免费使用价值150美元/月的Azure云服务。VisualStudiocommunity2013是一个专业级别的IDE,你可以作为爱好者免费使用C#与Java和C++关系密切。而且,对于已经了解C语言的开发人员来说也很容易阅读。本书作者之一NicolasDorier为.NET创建了最受欢迎的比特币框架,名叫NBitcoin。你可以查看这个网址:。我们可以将它用于任何项目,无论是出于爱好还是以盈利为目的。84.预备条件a.技能你应该熟悉面向对象和函数式编程如果对C#有基本的了解当然更好,不过我们认为,对于Java或者其它类C语言开发人员,本书代码也是清晰易读的。不要求有专业数学知识。我们不涉及超过最基本要求的加密知识,最基本要求仅限于创建一个安全服务。你不必对比特币有深入了解。但是我们推荐阅读的作为额外加分项。b.工具VisualStudio2013-你可以在GoogleBing上搜索“Visualstudio2013community”,然后免费下载使用。比特币核心代码-你需要在开始前进行同步。拾遗:你可以咨询微软cortana或者谷歌Now了解比特币的汇率95.本书众筹如果继续为你贡献内容,我们需要购买披萨、咖啡和寿司。我们需要获得足够多的币。并且如果没有你的反馈,我们将变得漫不经心,以至于无法完成整本书籍的编写工作。因此,我们启动了下列实验,希望你感兴趣。也许有一天你会将它变成完整的商业模型。我们创建了以下内容(不需要担心,我们将在后面看到这里每一行的含义)地址:1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB签名:H1jiXPzun3rXi0N9v9R5fAWrfEae9WPmlL5DJBj1eTStSvpKdRR8Io6/uT9tGH/3OnzG6ym5yytuWoA9ahkC3dQ=信息:NicolasDorierBookFundingAddress现在我们开始编写本书。当我们肚子饿了,我们就暂停,要求得到本书一下章节的资金支持。你将通过编程完成一个挑战的形式进行汇款,简单地使用钱包汇款将不算数。捐赠人员将通过他们的比特币地址授权获得下一章节。没有任何数字版权管理。如果你没有通过汇款取得了本书,希望你能按照本书的指引汇款。我们将进入下一章节的详细内容。不要掉以轻心,你需要通过编程学会如何使用它。你可以在这个网址上得到更多介绍::MasteringBitcoin,AndreasM.Antonopoulos编著NicolasDorier关于CodeProject的文章()开发人员手册,网址:,它们有箭头辅助阅读,表明产生的目标内容。举例来说,下列图标应理解为“秘钥+密码=加密秘钥。加密秘钥+密码=秘钥。”虽然代码很好,但是有时候一张图胜过千言万语。不用担心,我也会把代码写下来的。128.许可:CC(ASA3U)如前面“本书众筹”部分描述的一样,我们将向资金支持者的比特币地址分发本书。一旦获得本书,你就可以免费分享和修改,具体参照署名-相同方式共享3.0未本地化版(CCBY-SA3.0)。在免费获得本书后,如果在提醒时给点小费,我们将不胜感激。加密货币拥趸可能说:股权证明和工作量证明是最好的感情表达方式,其它都是浮云。139.项目设置在开始前,我们想告诉你项目的设置要求。1.打开VisualStudio,创建一个新的ConsoleApplication。命名为“ProgrammingBlockchain”。2.在SolutionExplorer中右键打开“Reference”,选择“ManageNuGetPackages…”3.搜索“NBitcoin”并安装。注意:下图仅供参考。实际版本和发布日期因你阅读本书的时间而不同。4.在SolutionExplorer中右键打开“ProgrammingBlockchain”,选择“Add”,然后“NewFolder”,命名文件夹为“Chapters”。5.右键打开“Chapters”并选择“Add”然后“NewClass”。命名这个类为“Chapter1”。在本书的其它章节也如此这般做法。6.打开“Program.cs”,并添加以下代码。14usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;usingSystem.Text;usingProgrammingBlockchain.Chapters;namespaceProgrammingBlockchain{classProgram{staticvoidMain(string[]args){//Selectthechapterhere.varchapter=newChapter1();//callthelessonhere.chapter.Lesson4();//thiswillholdthewindowopenforyoutoreadtheoutput.Console.WriteLine(\n\n\nPressentertocontinue.);Console.ReadLine();}}}7.注意“usingProgrammingBlockchain.Chapters;”被添加到正在使用的区块。8.这时候,VisualStudio在抱怨“chapter.Lesson1()”不存在。继续阅读本书,我们将创建它。151.比特币地址你的比特币地址是用来接收别人付款的。你也许知道,钱包软件使用私钥来付款。一个比特币地址由两部分组成,一部分是公钥哈希值经过Base58check编码的组合,另一部分是关于这个网络地址的信息。Base58check编码有一些很精巧的特性,比如用于避免拼写错误的验证码,避免模糊的字符比如“0”和“O”。拾遗:TestNet是用于开发目的的比特币网络,在这个网上的比特币没有任何价值。MainNet才是人人知道的比特币网络你也许不知道,就区块链而言,还谈不上比特币地址。内部来说,比特币协议使用ScriptPubKey验证比特币的接收动作。ScriptPubKey是一段简短的脚本,用于解释在什么情况下才能声明比特币的所有权。随着本书深入分析,我们将考察S