当前位置: 首页 > 编程日记 > 正文

深入了解以太坊

正在看这篇文章的你,应该是一名被区块链技术所吸引的开发者或者极客。我相信你已经理解了区块链的技术原理,并急切地想要搞清楚这项技术将为你和你的开发技术栈带来怎样的影响。

如果你需要更基础的区块链技术介绍,可以阅读比特币和以太坊的白皮书。

这篇文章的目标是:

解释区块链项目的开发和现有软件开发模式的区别。

提供上下文,帮助你更好地思考该领域的机遇和挑战。

提供区块链领域的基础资源和资料,便于开发区块链项目。

开发模式的转变

互联网的网络效应产生了大量的中心化的数据,这些数据促进了互联网应用的发展。受惠于共享开放的网络协议(比如 TCP/IP,HTTP),诸如 Yelp,Facebook 和 Amazon 这样的公司得以把自己的用户——当然也包括用户产生的数据——集中存储在自己的服务器上。这样一来,这些互联网巨头们除了比用户量小的企业更有优势之外,他们还对自己所拥有的海量用户数据如何变现有着 100% 的控制权。用数字货币投资者 Joel Monegro 的话说就是,现有的互联网模式使得绝大部分的价值被应用层所攫取,而应用层的基础,也就是底层的协议层则获利很少(即,“胖”应用层,“瘦”协议层模式)。

相反,区块链技术带来的价值分布模式,可以被理解为是一种“胖”协议层,“瘦”应用层的模式。正是密码学货币的创新,使得这种模式成为可能。正如 USV 的 Albert Wagner 所说:

“一直以来,靠协议赚钱的方式只有一种,那就是基于该协议开发软件并出售(当然最近都转为出租了)… 然而密码学货币则提供了一种直接在协议层变现的可能,并且随着基于该协议的应用越来越丰富,底层协议的变现能力也会随之越来越强,反映在数字货币上就是价格越来越高。”

从前那些互联网开放协议的开发者们,也就是 DARPA 网的研究员们或者那些无偿的贡献者们,并不会因为开放协议的发展或基于其上的应用越来越多,而获得直接的经济回报。不同的是,现在的协议开发者们可以直接发行数字货币了,比如比特币或以太币,而这些数字货币则直接代表了去中心化协议的价值。

Joel Monegro 相信,区块链技术所带来的这种模式上的转变,将促使开发者重新审视自己的应用。“数据的开放共享和内生激励机制的结合,最终会终结“赢者通吃”的市场现象。这将改变应用层的游戏规则,并且催生一批有着全新业务模型的公司。而这些公司业务模型的不同将主要集中在协议层。”

以太坊

前面的讨论带给我们的结论是:区块链技术带来的创新让开发者们可以直接在协议层获得价值。接下来我们将继续讨论,区块链技术是如何朝着开发者友好的方向演进的。8 年前,一种无需中心化金融机构背书的数字货币出现了,它就是现在人们耳熟能详的比特币。一开始,开发者们试图将数据直接存储在比特币的区块链上来开发应用,结果表明,这种方式非常低效(Joel 的这篇文章是个很好的例子)。其中一位开发者 Vitalik Buterin 实在是受够了比特币对于新特性极端谨慎和保守的态度,于是他开发了一个新的区块链平台以太坊(Ethereum)。

比特币的初衷是创造一种新的价值存储的媒介。以太坊则是为了实现一个图灵完备的区块链开发平台。在以太坊网络中,开发者们可以使用 Solidity 这门编程语言编写智能合约,这些合约则由以太坊虚拟机(EVM)来运行。从 Vitalik Buterin 的例子中我们不难看出,开发者们完全可以开发一个全新的区块链网络,以此来满足自己多样的需求。当然,从头开发新的区块链网络也有缺点,比如你要从头开始构建开发者社区。但直接在类似以太坊这类成熟的网络上开发,则没有这样的问题。而且一个显著的不同是,开发基于区块链网络的应用,开发者不仅会是这个应用的所有者,也会成为因此而繁荣的底层协议的直接受益人。

去中心化应用(Dapps),代币和智能合约

现在的开发者们基于现有的区块链协议(比如以太坊)开发出了满足不同用户需求的去中心化应用(dapp)。开发者一般会在 dapp 中发行自己的代币(token),用户可以通过消耗代币来让 dapp “执行”相应的操作来实现某个“功能”。代币其实并不神秘,你可以把它想象成人们在商场的电玩世界里买的游戏币。这些通过“智能合约”实现的“功能”通过收取一定的费用(代币),使得 dapp 可以在不依赖第三方的情况下对外提供可靠的服务。用游戏币来类比就是,只要有足够的游戏币,你随时都可以把游戏币塞到篮球机里玩一局!

一般情况下,代币的总量是固定的,因此随着某个 dapp 提供的服务越来越流行,基于简单的供需原理,代币的价格肯定会水涨船高。基于这个逻辑,dapp 的开发者们往往通过发售代币的方式来募集开发资金(而不是通过传统的融资渠道),这一过程的另一个众所周知的名字就是 ICO(初始代币销售)。

看到这里你可能会问,“为什么每个 dapp 都要发行专用的代币,而不是用现成的,比如以太币(eth)呢?”。这个不难解释,因为专用的代币利于特定应用生态里的小微经济。换句话说,专用的代币可以针对应用的特定功能和需求作出灵活的调整,如此一来,这个代币就能更好地服务于这款 dapp。说到这里,我们不得不提到以太坊(Ethereum)。以太坊正是这么一个让 dapp 开发者们可以方便地发行代币的平台。

早期机会

有了上述这些对于 dapp 底层机制的理解,接下来你应该思考这么一个问题了:去中心化到底会给你的用户带来什么价值?我们希望你可以先想清楚上面这个问题,而不是一上来就开始急着“去中心化”现有的产品。举个例子,Augur 这款产品依靠区块链技术实现了一个预测市场。为什么要用区块链技术实现?正是因为这项技术带来的鼓励诚实的经济激励机制,使得散布在世界各地的参与者因此而能够作出更准确的预测。

在开发者层面,区块链技术也带来了一次技术栈的创新机会。现有区块链的开发者们很喜欢把现在的情形跟互联网早期做类比,那个时候各种开发工具和框架都还不够完善,而现在的区块链开发领域正是如此。来自 Stream 的 Ben Yu 认为这是开发者的新机会:“很多看起来是举手之劳的基础工作亟待完成,如果说区块链技术社区的现状很像 1994 年的互联网的话,那么,为了将其演进到 2017 年的互联网,还要完成很多基础架构工作”。

由于区块链技术的创新,很多人已经看到了创建全新的、去中心化的网络栈的机会。这种全新的网络栈将不再依赖中心化的政府或公司。传统的网络栈由 TCP/IP,DNS,数据库,网络服务器,鉴权系统和 CDN 这些基础组件构成,而现在,我们有机会通过类似于以太坊这样的平台,用去中心化的方式,重新实现传统网络栈中的各个组件。

“不可篡改”带来的挑战

就像早期的 Javascript 技术一样,区块链技术演进的过程必然伴随着各式各样的挑战。其中最大的挑战之一,也是区块链技术最突出的特性,那就是“不可篡改”。由于这个特性,开发者们无法更改底层的区块链,也无法更改顶层的智能合约,对基础库和合约进行版本控制也非常困难。最近 Parity 的一个 bug 直接导致了价值 1.5 亿美金的以太币被锁。诸如此类的事故不断地提醒我们,构建经得住未来考验的架构是非常重要的。

关于这种不可篡改性对业务安全所带来的影响,来自 0x 项目的开发者 Brandon Millman 跟我们分享了他的看法:“跟传统项目相比,在这个领域做开发意味着你要加倍小心,因为任何问题都将直接影响用户数字资产的安全。一直以来,区块链技术对于私有财产的有力保护广为人知,也就是说,只要你安全地控制着私钥,理论上没有人可以偷走你的资产。但这个领域更多的偷窃行为并不是通过直接盗取用户的私钥来实施的。骗子们更多地是通过诱骗的方式,让用户将数字资产转移到他们的钱包,最终达成行窃的目的。”

开发者们,尤其是那些来自创业公司习惯了快节奏开发的开发者们,不得不停下来思考如何在速度和安全性之间找到平衡。就像来自 Stream 的 Ben Yu 说的那样:“开发者们普遍推崇的一个原则是:move fast and break things. 这句话在区块链领域只有前半句成立。这个领域的发展日新月异,所以你必须 move fast 才不至于被竞争对手超越,但 break things 则意味着成千上万的金钱损失。”

区块链领域的开发需要更加周密的计划。由于开发者对于整个系统缺少中心化的控制,因此 dapp 是很难像传统应用那样做快速热修复的。相反的,在区块链世界要想做系统级别的变更,则往往意味着整个协议的硬分叉。

以太坊的局限性

除了上面讲到的“不可篡改”带来的挑战,开发者在以太坊网络上还可能碰到一些其他限制。比如,以太坊网络不支持通过外部调用的方式获取自身区块链以外的数据。开发者们需要依赖第三方数据提供商来向智能合约注入外部数据,这类数据提供商也常常被称作预言机(Oracle)。

除此之外,以太坊的性能不足以支持实时计算。以太坊网络中区块的处理时间长达 15 秒(跟比特币网络的 10 分钟比起来已经很快了)。因此,开发者们需要写一些异步代码来进行状态的更新(这一点跟 React 很像)。

同时,在以太坊网络中,合约执行的每一步都需要消耗 gas,而 gas 最终会以以太币(eth)进行结算。因此,开发者们可能经常会碰到由于 gas 设置过低,导致计算无法完成的情况(比如这款象棋游戏)。也就是说,以太坊的“链上计算”是非常昂贵的,同时也非常消耗带宽。因此,市面上也产生了一些像 Truebit 这类旨在降低计算成本的“链下计算”服务。

如何开始

简单来说,这是一个令人叹为观止的领域。区块链技术是交叉学科的典型代表,这一技术涉及了经济学、博弈论、金融学、计算机科学、数学、密码学等众多学科领域。而交叉学科往往也意味着,有很多基础工作需要完成。

对于区块链领域的新人,来自 0x 项目团队的 Brandon 给的建议是,选择自己感兴趣或跟自身经历相关的领域为切入点,而不是一上来就想吃成大胖子:“如果你之前做的是 JS 开发工作,那么这个领域有非常多的 JS 库需要你这样的人来完善。假以时日,在开发过程中,你就会逐渐理解并熟悉这一领域。你无须有完成一门课程才能入门的负担。”

正如区块链技术所宣扬的“去中心化”思想那样,这一领域的绝大多数项目的代码都是开源的。下面就列出了一些可以让你快速上手的资源:

• Solidity 官方文档 是学习这门语言的很好的开始。

• Truffle 框架 是 solidity 最好的开发框架之一。

• 在 zeppelinOS 代码库 里可以看到很多知名的开源库。

• Blockgeeks 提供了一个详细的 以太坊代币开发指引,并附有一些代码示例和抽象概念。

• 你也可以从火爆全网的 Crypto Kitties 那里学习 如何在区块链上创建自己的游戏。

如果你想做一些项目练手,也许下面这些主意不错:

• 创建自己的钱包应用。可以是网页版,移动版或桌面版

• 发行自己的 ERC-20 代币,并部署在测试网络上。

• 改一改 crypto kitties 的代码(比如改成狗,坦克,僵尸)并部署在测试网络上。

展望未来

目前看来,我们必须承认,围绕区块链的开发一团乱麻。跟现有成熟的网络开发相比,区块链领域还没有好用的框架和工具。但换个角度想,这种早期的混乱,正是一个机会,更重要的是,这是一个极有可能带来开发模式巨变的机会。

在区块链上,你不需要部署任何中心化的服务器,这就意味着单点失败的风险为零。如果你的整个技术栈都是去中心化的,那么就不需要引入“可信”的第三方,而没有第三方则意味着可以 100% 对抗审查。区块链技术带来了数据开放的新机会,基于区块链的去中心化数据库未来可期。

有了区块链技术,我们可以预见这样一个未来世界:一个没有中间人,并且信息和权利被系统性地分散开来的世界。

想学习更多的以太坊知识请点击

upchain.ke.qq.com/#tab=1&…

转载于:https://juejin.im/post/5c1204485188252704368cdc

相关文章:

Netty和JDK源码来看Netty的NIO和JDK的NIO有什么不同

JDK底层提供了NIO实现,在Linux环境会调用内核epoll。 但是Netty通过JNI的方式提供了Native Socket Transport,为什么Netty要自己搞一套NIO呢? 这篇文章带你从jdk的源码和Netty的源码角度来分析为什么Netty要这么做。 JDK源码:openjdk-8u40 Netty源码:netty-4.1 1.先看J…

【数据结构】单链表的实现(C语言)

单链表是线性表链式储存的一种形式,其中的结点一般含有两个域,一个是存放数据信息的info域,另一个是指向该结点后继结点存放地址的指针next域。一个单链表必须要有一个首指针指向链表中的第一个结点。 单链表要掌握以下几种操作:…

《理解 OpenStack + Ceph》---来自-[爱.知识]-推荐

企业IT技术分享(2016-06-29)来自(QQ群:企业私有云平台实战 454544014-推荐)!理解 OpenStack Ceph (1):Ceph OpenStack 集群部署和配置http://www.cnblogs.com/sammyliu…

windows10 安装 mysql8.0.12 详解

【1】下载安装包 官网下载地址:https://downloads.mysql.com/archives/community/ 如下图所示: 下载完成,安装包为mysql-8.0.12-winx64.zip 【2】安装准备 (1)安装路径。拷贝安装包到任意路径,然后解压缩。…

IDEA常用和实用配置以及各种必要插件

主要是收集IDEA常用和不常用配置陆续更新 ------------------------ 启动项目配置 建议使用idea2021.1.3以上版本: ------------------------ maven没有设置自动导包,导致引用不到第三方依赖。 可以点maven的刷新按钮即可。 idea 设置gradle自动更…

linux 调试利器gdb, strace, pstack, pstree, lsof

1)如何使用stracepstack利器分析程序性能?http://www.cnblogs.com/bangerlee/archive/2012/04/30/2476190.html此文有详细介绍怎么用strace和pstack2)Linux下多线程查看工具(pstree、ps、pstack)?http://blog.csdn.net/yfkiss/article/details/67293643)使用strace,lstrace,t…

【数据结构】单链表的应用(C语言)

1、设计一个算法,求一个单链表中的节点数 2、设计一个算法,在一个单链表中值为y的结点前插入一个值为x的结点(值为x的新结点为成为值为y的结点前驱结点) 3、设计一个算法,判断单链表中各结点是否有序 4、设计一个算…

物联网设备僵尸网络趋势分析

物联网(IoT)僵尸网络作者正在适应更安全的物联网设备的转变,这已经将***者的注意力转移到利用物联网设备的漏洞上。由于物联网设备安全性仍处于起步阶段,因此发现命令注入等基本漏洞并不少见。2018年11月,NetScout的As…

Redis6安装配置集群cluster以及集群宕机注意事项

Redis6的cluster模型推荐3主3从 先准备3台服务器,每个上面部署2个redis,服务器配置2核2G: 下面在每台服务器安装redis6,每台机器只要安装一次即可,然后分别配置2个端口的conf文件,分别起来即可&#xff1a…

【数据结构】循环单链表的实现(C语言)

循环单链表应掌握以下基本操作: 1、建立一个空的循环单链表。 2、获得循环单链表的最后一个结点的位置。 3、输出循环单链表中各结点的值。 4、在循环单链表中查找值为x的结点。 5、在循环单链表中第i个结点后插入值为x的新结点。 6、在循环单链表中删除值为x…

DTRACE 专家

http://dtrace.org/blogs/bmc/ https://github.com/bcantrill http://www.tudou.com/programs/view/Q6fHZFgZww4 http://dtrace.org/blogs/ahl/2012/04/24/btrace-dtrace-for-java-ish/ JAVA https://github.com/chrisa https://github.com/ahrens

统一客服消息返回错误:{errcode:43004,errmsg:require subscribe hint: [9Vv08633952]}

2019独角兽企业重金招聘Python工程师标准>>> 公众号或者小程序发送客服消息错误: {"errcode":43004,"errmsg":"require subscribe hint: [9Vv08633952]"} 场景:小程序使用公众号的服务消息,推送消息…

sublime Text 开发工具

简介描述 Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。,具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text …

【数据结构】双链表的实现(C语言)

双链表中的结点包括3个域,一个是存放数据信息的info域,另两个是指阵域,这里用llink和rlink表示,llink指向它的前驱结点,rlink指向它的后继结点。 双链表要掌握以下基本操作: 1、创建一个空的双链表。 2、…

ShardingSphere-Proxy分库分表以及多租户安装使用

需求:你提供SAAS服务,你有你有2个租户(商户),各自的数据进各自的库,而你不希望你的微服务java里默认配置多个租户数据源,数据连接池太多,而且后面动态增加也不方便,诸如此类很多问题。 方案&am…

jenkins自动化部署工具

jenkins自动化测试 & 持续集成 知识点: 1。下载地址:jenkins.io download: 转载于:https://www.cnblogs.com/kaixinyufeng/p/10123419.html

android 图片水印处理 文字倾斜处理

方法一: 获取一个textview 从textview中获取bitmap,将bitmap 通过matrix进行角度变换,然后将原图和此bitmap合并; 方法二: 将原图获取bitmap后,得到canvas,将canvas进行角度变换,…

Centos下MySQL安装与配置

一、mysql简介说到数据库,我们大多想到的是关系型数据库,比如mysql、oracle、sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库,咱不得不首先推荐的是mysql数据库了,而…

【数据结构】链式栈的实现(C语言)

栈的链式存储称为链式栈,链式栈是一种特殊的单链表,它的插入和删除规定在单链表的同一端进行。链式栈的栈顶指针一般用top表示。(个人理解:相当于只对单链表的第一个结点进行操作) 链式栈要掌握以下基本操作&#xff1…

opencv python 匹配

opencv python 匹配

DI 依赖注入实现原理

深度理解依赖注入(Dependence Injection) 前面的话:提到依赖注入,大家都会想到老马那篇经典的文章。其实,本文就是相当于对那篇文章的解读。所以,如果您对原文已经有了非常深刻的理解,完全不需要…

【数据结构】链式队列的实现(C语言)

队列的链式存储称为链式队列。链式队列就是一个特殊的单链表,对于这种特殊的单链表,它的插入和删除操作规定在单链表的不同端进行。链式队列的队首和队尾指针分别用front和rear表示。 链式队列要掌握以下基本操作: 1、建立一个空的链式队列…

离线安装k8s 1.9.0

说明本文参考 https://segmentfault.com/a/1190000012755243。在前 文基础上整理、增加说明,避坑。 踩过的坑: 安装k8s 1.9.0 实践:问题集锦 环境说明 环境信息(采用一个master节点两个node节点) 192.168.1.137 tensorflow0 node …

eclipse 和 google拼音输入法冲突问题

eclipse每次当我按ctrl鼠标点击 代码 ,本来应该是跳转到相应地方,可是现在每次一点eclipse就关掉。苦经搜索才知道,原来是使用eclipse时同时使用了谷歌拼音的问题,只要不要在点的时候使用谷歌输入法就好了。唉,谷歌拼音…

【腾讯bugly干货分享】微信Android热补丁实践演进之路

为什么80%的码农都做不了架构师?>>> 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?modviewthread&tid1264&extrapage%3D1 继插件化后&…

【ACM】杭电OJ 1001

是一道简单的题目&#xff0c;我只想要说&#xff1a;注意输出格式&#xff01; #include "stdio.h" int main () {int n,sum;while(scanf("%d",&n)1){sum0;for(int i1;i<n;i){sumi;} printf("%d\n\n",sum);}return 0; }

大数据处理也要安全--关于MaxCompute的安全科普

[TOC] 1.企业大数据处理现状 当今社会数据收集手段不断丰富&#xff0c;行业数据大量积累&#xff0c;数据规模已增长到了传统软件行业无法承载的海量数据&#xff08;百GB、TB乃至PB&#xff09;级别。基于此&#xff0c;阿里云推出有了一套快速、完全托管的GB/TB/PB级数据仓库…

自创设计模式-----答题卡模式

该模式是解决触发条件和触发结果的解耦&#xff0c;同时兼顾触发条件资源的可释放性。目的是为了获得触发结果。 /*** */package com.baidu.coolapp.answer;import java.util.Hashtable;import com.baidu.coolapp.composite.IComposite;/*** author liweigao**/public interfac…

The system cannot find the file specified

在家工作&#xff0c;程序在家里的电脑运行时&#xff0c;出现一个异常&#xff0c;还是第一见到&#xff1a; Server Error in / Application. The system cannot find the file specified Description: An unhandled exception occurred during the execution of the current…

【ACM】杭电OJ 1002

题目链接&#xff1a;杭电OJ 1002 表面上看是ab&#xff0c;很简单&#xff0c;其实是大数的相加&#xff0c;所以要考虑的因素有很多&#xff1b;&#xff08;瞬间觉得要是能用Python多好&#xff0c;哈哈哈&#xff09; 还有&#xff01;&#xff01;&#xff01; 要特别注…