区块链会是一场革命吗?


今天,很多成功的互联网企业都是在以中介者的形式存在。比如Google——你和互联网之间的中介,比如亚马逊——买家和卖家之间的中介。但区块链——以“去中心化”为最基本特征的技术的发展却很有可能破坏这些互联网巨头赖以成功的结构。


互联网巨头的事咱们暂且不操心,那么从一个开发者的角度呢?我们需要关心什么呢?作为一个开发者,我们该如何使用区块链构建应用程序? 我们可以在这么复杂的基础概念之上创造出非常易用的工具吗?这个工具的开发体验又有多友好呢?


我们知道,最好的教程就是带你去从头开发一个应用程序。所以我们将使用区块链技术制作一个简单的去中心化广告服务器,称为“零美元主页”。本文将告诉你一群开发者在摸索使用区块链技术时最完整的试错经过和心路历程



什么是区块链应用?


要做区块链应用,首先要知道区块链有什么特性。而它最突出的特性就是“去中心化”。简单来说,就是不再像以前的技术一样需要一个中心节点负责管理,而是通过一系列复杂且可靠的技术,由网络中所有的节点共同认可,共同记录,共同维护,解决网络中交易双方的信任问题。这是一条神奇的链,有了这个链就真的可以实现没有中间商赚差价了。


回到正文,区块链正在以去中心化的特质威胁着互联网巨头们的基础。而本文将集中于广告平台。广告平台是广告位购买方和广告渠道提供商之间的中介。我们的项目是通过区块链技术建立一个去中心化的广告平台。也就是跳过广告中间商,通过利用区块链技术本身的特性解决在互联网环境中进行交易时相互之间的信任问题。


自著名的百万美元主页实验以来,想要在付费广告领域通过创新变的富有已经越来越困难了。



640?wx_fmt=png


2005年,一个21岁的英国男孩Alex创建了一个名为“百万美元主页”的网站,将页面做成100万个小格子组成的广告牌,每个格子售价1美元。这一别出心裁的创意吸引了不少广告商注意,不到一年时间内,100万个格子全部售出。


相反,我们选择建立一个允许免费展示广告的平台——零美元主页。 免费,但并不代表什么都不付出:广告商需要通过开源贡献来换取广告位。因此,我们构建了一个去中心化的应用来管理广告在特定网页上的展示方式。 广告商需要具备编程能力,以便能够将他们的广告放在此页面上。



用户工作流程


具体而言,当我们在marmelab的开源库之一合并Pull请求(PR)时,会有一个GitHub机器人对PR进行评论,并邀请PR作者在广告平台管理面板上发布他们的广告。


640?wx_fmt=png


打开评论中包含的链接之后,PR作者会被要求使用他们的GitHub凭证进行登录。然后,他们可以上传广告——实际上就是一张简单的图片。此图片将按照时间顺序添加到同样由其他PR作者上传的图片队列中。


640?wx_fmt=png


每天半夜的时候,脚本都会自动地获取下一个图像(使用先进先出排序),并在接下来的24小时内将其显示在上。


640?wx_fmt=png


注意:这整个过程不需要中介参与,但为了避免在网站上出现成人内容,我们会在图像上传之后,发布之前通过Google Vision API进行验证。



应用架构


以下是我们广告平台的四步的架构:


640?wx_fmt=png


  • 开源贡献者通知 只要开源PR合并到了我们的某个存储库中,GitHub就会将PR详细信息发送给负责管理的app。app会在PR下方进行评论以通知贡献者。该评论包含一个可以进入管理界面的链接,以及PR的详细信息。


  • 声明和图片上传 在打开评论链接之后,贡献者会转到管理员界面。他必须使用他的GitHub凭证登录才能通过身份验证。管理程序然后会通过GitHub获取PR详细信息,并检查贡献者是否是PR作者。如果没有问题,管理程序会显示图片上传栏。当贡献者上传图片时,管理程序会将PR ID推送到区块链,并将图片上传到CDN(以PR id命名)。管理程序同时会根据区块链中仍在等待发布的图像的有效PR数量计算并显示图像发布的大致日期。


  • 广告位置 每隔24小时,cron(一个执行周期性任务计划的程序)就会要求区块链查找尚未发布的下一个PR。 区块链将此PR标记为已发布并发送该ID。 cron将以PR id命名的图像重命名为“current image”。


  • 广告显示 每次访问者想要在“零美元主页”中发布广告,该主页都会向CDN询问当前图像。如果它恰好是区块链上最新发布的广告,那么该广告就会至少保留1天(直到另一个贡献者声明了一个PR为止)。


看起来有点意外的是,区块链在这个过程中起着非常小的作用。这是因为在实际编程过程中,我们发现无法把广告平台的整个代码都建立在区块链之上。事实上,区块链在连接互联网和处理方面的能力都非常有限。所以我们只用区块链来实现最关键的广告投放任务:


  • 注册经过认证的贡献者的Pull请求

  • 获取最后一次没有发布的Pull请求,并将其标记为发布


由于各种原因,管理程序中的其他任务最终没有使用区块链:


  • 从webhook对Pull的请求进行注册 在Pull请求之前进行注册是没有用的,因为Pull作者可能从未声明它。此外,将数据存储在区块链中并不是没有代价的,所以我们只存储我们必须存储的数据。但这样做的缺点是,我们的公共软件仓库(包括在此实验之前创建的公共软件仓库)中的任何公共资源都有资格进行下一步操作。


  • 通过在GitHub发布评论来通知用户 智能合约不能调用外部API,所以我们不能通过这项技术来实现本项任务。因此,我们将此任务交给管理程序来完成。


  • 验证声明的PR的作者 同样是因为智能合约不能调用GitHub API。所以,我们也把这个逻辑任务移至管理程序,并将其作为调用区块链的先决条件。


  • 存储图像 理论上,我们可以将任何东西存储在区块链中,包括图像。 但实际而言,图像需要很多存储空间,而且我们没有办法在我们的智能合约中存储多个“表格”(数据阵列)。


  • 将显示的广告更新为队列中的下一个 区块链中没有与setTimeout函数或cron工具等类似的功能。然而,你可能每隔x个区块就需要执行一次代码,不过这与时间无关。所以,我们在API上使用了类似cron的库。



研究,记录和第一次尝试


考虑到区块链网络的成熟度和设计目的,我们在选择要开发的区块链网络时最终选择了以太坊。


很快,我们就遇到了第一个困难。直到几个星期前,哪怕只是简单的测试,如果没有购买以太币,我们也无法使用以太坊区块链。此外,以太坊在之前的版本(名为Frontier)中并没有真正许可私有链,这就使开发变得非常复杂。因为没有私有链,只能在公共网络上进行开发,任何访问以太坊网络的人都可能会调用你的测试合约。更重要的是,这份文件只是一个志愿倡议,并且与发展状态不同步。


注:在我们开始开发程序后,以太坊就发布了新版本,从Frontier切换到Homestead,并且改善了Homestead的文档质量。



640?wx_fmt=png


尽管存在这些缺陷,我们仍然在Nancy,Paris和Dijon的以太网网络上成功注册了三个节点,并在这些节点之间共享ping。


在文档搜索中,我们最终找到了 Eris 文档。Eris在解释区块链和合约方面做得非常出色。此外,他们专门在以太坊之上建立了一个层级,并开源了一系列工具以简化智能合约的开发过程。


Eris是一个命令行工具,你可以使用它来初始化你需要的任意数量的本地区块链。



如何操作智能合约


智能合约与API非常相似。它有几个公共函数,可以被在区块链网络上注册过的任何人调用。但与API不同的是,智能合约不能调用外部Web API(区块链是封闭的生态系统)。但是,智能合约可能会调用其他智能合约,只要知道他们的地址。


与API一样,公共函数只是它们的冰山一角。实际上合约可能由许多私有函数,变量等组成。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


猜你喜欢

转载自blog.csdn.net/taoxiuyi0679/article/details/79470737