以太坊:比特币 + 无限可能
链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
还记你得刚学编程时,第一次使用“对象”的感觉吗?还记你第一次尝试函数式编程的样子吗?这些编程范式,你还记得用了多久才把它们从懵懂的概念进化为直觉的?其实,学习面象区块链编程很像面向对象与函数式编程:刚开始很绕,渐渐的就明白了。我们在这个系列的上半篇,通过比特币的区块链,了解了区块链大致是如何运行的。这下半篇,我们就来探索一下以太坊的区块链,进而学习面向区块链编程。从长远上讲,学会如何结构化区块链内的互交,并把它培养成直觉,对学习者是有极大裨益的。
首先,把《以太坊白皮书》的前三章看完。这三章主要讲帐户,转帐和消息。要是有兴趣也可以把剩下的读完,但其实只要把这系列的上半部份读完,你就已经理解了底层技术的基础了。和读《比特币白皮书》一样,第一遍读要是有什么不懂的,不要着急,慢慢的就明白了。
从现在起,从合同的角度思考问题!
智能合同其实就是存储在区块链里的代码。只要再加一个用户界面,智能合同就可以作去中心化应用(dapps)的后端了。用你已有的对比特币的理解,可以把一个比特比交易想成一个具有三个输入和两个输出的程序(比特币对输入和输出的定义并不是这样的,但先不要在乎细节)。输入指的是要交易的比特币总和,转账人的地址和收款人的地址。输出就是转账后,余额更新后的这两个账户。被矿工挖出来的交易记录是公开的,里面记着一个有某些输入的程序曾经运行过并产生了某些输出。在比特币里,这种转账程序就是唯一存在的程序,每个节点因此都能根据输入正确的验证输出。
以太坊把程序的限度,从简单的转账,扩展到了一切能在图灵机上编写的程序。要是你计算机课上忙着睡觉了的话,这意思就是任何能被编程的东西,也同样能在以太坊上被编程。
以太坊能有这样的复杂性是因为每个网络节点上都运行着一个虚拟机(叫以太坊虚拟机,或EVM)。EVM和其它任何的虚拟机没什么不同。举个例子,你可能已经熟悉Java Virtual Machine (JVM)。JVM代码在任何装有它的机器里,同样的输入会产生同样的输出。相似地,EVM也能让以太坊区块链代码,在同样在输入下产生公认正确的输出。
比特币区块链的完整节点里存有从零区块到现在的所有记录;以太坊的完整节点里,还多了静态代码(若是存在),与之相关的账户信息,和代码此时的状态。
想象存储在账户内的一个简单程序,它只接受数字输入,然后把这输入的数字加到一个累计的数字上,再用新的总和来代替旧的。有两个账户和这个合同账户进行了交易,一个输入了5,另一个输入了2。现在在区块链里的信息有:
合同账户和它的静态代码。
这个合同账户的目前存储状态,即总和为7。
一个这个账户过去的账户存储状态,即总和为5。
一个这个账户过去的账户存储状态,即总和为0。
三个转账记录:一个是代码最开始的存储,一个是某账户输入的5,另一个是某账户输入的2。
想象一个类似的程序,(必然地)储存在另一个账户里。这个程序除了有上面的功能,还存有一个线性的数组,里面存储着有两个字段的结构(结构指的是结构化的排列数据的模板),每个结构里存有寄帐人的地址,和寄帐人输入的数字。有两个账户和这个合同地址进行了交易,一个输入了5,一个输入了2。现在区块链里的信息有:
合同账户和它的静态代码。
这个账户的目前存储状态,即总和为7,和一个含有两个结构的数组。
一个这个账户过去的存储状态,即总和为5,和一个含有一个结构的数组。
一个这个账户过去的存储状态,即总和为0,和一个空的数组。
三个转账记录,一个是代码最开始的存储,一个是某账户输入的5,另一个是某账户输入的2。
现在我们可以轻松地重新构建这个账户之前的状态,并查看都有哪些账户和它有过交易,从而创建了现在的状态。可这种模式应该尽量避免。为什么呢?用上面的例子来说,所有存储在数组里的数据都可以方便的用区块链本身构建出来。读到这里,心眼儿不老实的读者可能已经想到了多种轰炸区块链的方法了。下面我们来学习一下以太坊是如何预防节点的硬盘和CPU被僵尸攻击(DoS)的,以及这些预防措施对开发者和用户意味着什么。从某些角度讲,对开发者来说这意味着要写入数据时要小心谨慎。
油费(gas price)
怎么防止有人上传10TB的静态代码合同,把所有网络节点的存储空间都耗尽呢?或者让CPU无休止的做无用功?和比特币一样,在以太坊上交易是有手续费的,以来激励矿工来处理交易和保护网络,不同的是以太坊是以“油费”的形式来收费的。就像汽车跑单位距离需要特定加仑的汽油,以太坊上的交易每运行单位CPU周期或储存单位数据也要花费特定的以太。因为以太本身是珍贵稀有的,所以就预防了僵尸攻击。区块链上的亿万富翁,想要烧钱搞恶作剧是可以让网络变慢一会儿的,但挖出这些恶意交易的矿工们也会赚上一笔的。
这对开发者和用户意味着什么呢?虽然读取本地区块链是免费的,但写入和运算是花钱的。储存更是尤其昂贵,因为任何写入的信息都会被永久的储存着。相比之下,CPU运算很便宜。正是因为任何程序所有的历史状态都被记录着,改变一个账户的存储状态,在一般程序里被认为是对已分配内存的操作,在区块链中却算作写入操作。以太坊是图灵完备的,谁也拦不住你写一个视频解码器然后发布在区块链上;只不过估计你没钱运行它。假设这样的程序的代码至少有几千行,即使把它上传到区块链上也不会便宜。一个帮助人们理解以太坊合同实际能力的启发是:这个功能是否能在一个1999年的智能手机上实现?
作为开发者,这意味着你得认真思考代码的效率。虽然存储效率尤其重要,但是CPU的每个周期也是要花用户的钱的。两个同样功能的合同,最有效率的那个才能生存下来。
知道了理论上的无限可能和现实中的各种限制:那么是什么让以太坊如此的炫酷?
现实中的例子
在同我们一起充满激情的讨论智能合同的无限可能,包括无基础设施的政府,和其它改变世界的想法前,作为开胃菜,我们来一起学习一个生活中简单的智能合同的例子。
假设我的乐队刚刚录制完一个全新的专辑,然后我们打算分享给我们的粉丝。可我们是朋克青年(译者注:朋克思想即反对体制,提倡个体自由),不管是iTunes还是YouTube,都是体制内的。所以我们打算把专辑印制100份限量版黑胶唱片,然后记录并只邀请购买者去我们认为最棒的酒吧观看独家表演。一般来讲我们会用类似PayPal之类的服务来收款,它再在每个交易里收取一些费用。我们收到钱后就发货,然后再在表格软件上记录这个交易,这样等到第101人要买的时候我们就不会忘了拒绝。这个计划听起来就不够稳妥,所以难怪艺人和粉丝宁可付中介费也要用类似Ticketmaster和Bandcamp的中介公司。幸运的是,乐队鼓手有编写以太坊智能合同的经验,我们就决定编写一个“购买记录表”来完成我们的计划。
这个记录表合同很简单,只有三个函数:purchase,provePurchase,和claimAlbum。粉丝在网页上通过purchase函数往合同账户里转入指定数额的以太。只要转入的钱大于等于售价,合同中的计数器就会累加。寄款人的以太坊地址和领认次数组成一个结构,保存在一个数组里。要是转账后计数器超过100,交易就会失败(并退款)。
购买成功后,粉丝会发给我们收唱片的地址。但在寄出前,claimAlbum函数会在数组里的各个结构中查找付款人的地址并将领认次数加1。只有领认次数为1的时候我们的网页才会接受这个收货地址,之后再发货。为了保证我们只接受完成付款的人们的收货地址,而且只发一份唱片,我们要求提交地址时用户与claimAlbum的转账(译者注:与区块链函数的互动都称为转账)必须使用与purchase函数的转账同样的以太账户。
那怎么防止表演当天没买专辑的人混进来呢?这时候就要用到provePurchase函数了。 只需在门口放个iPad,人们就可以用购买专辑的账户和provePurchase验证之前的交易了。如果这些账户存在于合同的数组里,就知道他们确实购买了专辑,provePurchase也就会返回True。看门的就会放行。
不仅如此,粉丝也能在购买前,验证我们的专辑是否真的是独家的。以太坊上的合同的地址是内容决定的,也就是说源码进了区块链后是可以被它的哈希散列找到的。合同源码若是开源的话,人们就可以独立的用源码的散列来验证区块上的合同的功能性。
这里描述的例子只是一个非常简化的实现,但你应该可以从中看到智能合同是如何免除中介的。Ujo Music,比方说,用更加稳固和易用的方式,实现了流媒体和转售的微支付,并让艺人有更多的掌控权。不仅如此,艺人可以保留100%的收入的。一般人们付苹果公司30%的利润得到的安全性,区块链也可以给你,而且几乎免费。
欢迎来到区块链的世界
现在我们有能力写任意复杂度的代码,把它存在区块链上,再通过它的哈希值去找它,并知道调用里面的函数后,这代码会在所有的节点上运行。代码输出的结果可以通过验证其过往的状态来达到所有节点的共识。这些复杂的函数交易就象比特币的转账一样被矿工挖出。我们上传到区块链的代码叫合同,也就是去中心化应用(dapps)的后台。“智能合同”这个比喻其实很好的解释了以太坊动作的方式,包括优势(合同无法破坏,任何的输入都会产生可预测的输出,并且记录无法修改)和劣势(比请律师便宜,但是不完全免费)。
相关文章:

thinkphp5内置标签
thinkphp5内置标签 知道内置标签怎么用,查手册的时候好查 却功能的时候在里面找着来用 内置标签一览 1 内置标签2 3 变量输出使用普通标签就足够了,但是要完成其他的控制、循环和判断功能,就需要借助模板引擎的标签库4 功能了,系统…

python可视化窗口制作一个摇骰子游戏_使用python制作一个抽奖小游戏——骰子游戏...
1.模拟真实环境掷骰子 从Python标准库中调用模块:random——random中包含以各种方式生成随机数的函数 从random中引用randint这一函数——骰子都是有固定面数 from random import randint **2. **创建Die类**** 骰子属性sides(面数)默认为6面…

C#拾遗(一、基本类型)
1. C#是一种块结构语言,用花括号{}分块,但是用#region和#endregion来定义可以展开和折叠的代码区域 #region 这是引用区 using System; ...... #endregion 2. C#简单类型都是小写,bool,string类型要区别于Java的写法;float、decim…

我不喜欢Go语言的十个理由
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 Go 语言有多火爆?国外如 Google、AWS、Cloudflare、CoreOS 等,国内如七牛、阿里、知乎等都已经开始大规模使用 Go 语言开发…

写扩展性好的代码:函数
http://blog.jobbole.com/107442/转载于:https://www.cnblogs.com/answercard/p/8862006.html

PHP学习笔记:万能随机字符串生成函数(已经封装好)
做验证码用到的,然后就把这个函数封装起来,使用时候要设置2个参数: $str设置里要被采集的字符串,比如: $strefasfgzsrhftjxjxjhsrth; 则在函数里面生成的字符串就回从efasfgzsrhftjxjxjhsrth里面随机抓取; …

python中getopt函数_python getopt模块详解
getopt这个函数 就是用来抽取 sys.argv 获得的用户输入来确定执行步骤。 getopt是个模块,而这个模块里面又有getopt 函数,所以getopt需要这样这样用。 getopt.getopt( [命令行参数列表], "短选项", [长选项列表] ) 该函数返回两个值. opts 和a…

Go语言的前景分析
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 抓住时代的趋势 在上篇文章中,也就是那个跨维度的打击,是可以直接秒杀的中,提到这个时代的问题,这次…

SQL获取当月天数的几种方法
SQL获取当月天数的几种方法 原文:SQL获取当月天数的几种方法 日期直接减去int类型的数字 等于 DATEADD(DAY,- 数字,日期) 下面三种方法: 1,日期加一个月减去当前天数,相当于这个月最后一天的日期。然后获取天数。(注意,…

移动端zepot媒体查询media queries
使用zepot做轮播图<head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0"> <title>jd首页</title> <link…

前端try catch是如何捕获异常的_一文告诉你如何优雅处理前端异常?
前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人。一、为什么要处理异常?异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由…

区块链热度不断,那么究竟是泡沫还是未来?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链究竟是泡沫还是未来,需要落脚到实际运用中去判断。区块链区别于传统服务器,其宗旨不是为现实世界带来某个特定的产品&…

集成 Kendo UI for Angular 2 控件
伴随着 Angular 2 的正式 release,Kendo UI for Angular 2 的第一批控件已经发布了,当前是 Beta 版本,免费使用。 官方站点:Kendo UI for Angular 2 Kendo UI for Angular 被打包成独立的多个 NPM package,在 Progres…

按钮垂直居中_带下拉按钮的动态图表
小伙伴们好啊,今天和大家一起分享一个图表制作的技巧,先来看看效果:这个图表里,其实有三个数据系列,分别是一深一浅两个颜色的条形图,再就是大大的圆圈儿,其实是用散点图模拟出来的。先来看数据…

第一周Access课总结
第一周Access课总结 1:这节课学到了什么? 这节课重点学了数据库是用来干什么 做什么的 老师怕我们理解不了 用了很长时间向我们举了很多的例子 让我们终于知道了数据库是用来干嘛的了 顾名思义 数据库就是存放数据的仓库 是长期存放在计算机内 有组织…

以太坊,EOS和其他DApps的总数达到2,432,但没有大规模采用
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 根据分散应用监测网站StateOfTheDApps,每月创建的新DApps数量的最高水平是2018年12月。去年最后一个月共有179个新的DApps上线。 以太…

docker logstash_用于监视Kubernetes和Docker的六大开源工具
Kubernetes和Docker是在DevOps圈中最常听到的两个词。Docker是一个工具,它使你能够以容器化的方式运行应用程序,Kubernetes是一个用于编排、管理容器的平台——如果你想使用Docker CLI去手动地管理数千个容器,这是不切实际的。然而࿰…

大道至简第一章读后感
当今社会,信息化飞速发展,软件的需求也越来越高,而《大道至简》给我们点透了编程的精义。 大道至简第一是讲的便是编程的精义,文章借愚公移山这个故事来阐释编程的基本思路:出现一个问题(惩山北之塞&#x…

nginx resolver 指令的使用
官方解释下就是:反向代理的场景,upstream后端用域名时,配置resolver以便于nginx能够解析该域名 Configures name servers used to resolve names of upstream servers into addresses 官网地址:http://nginx.org/en/docs/http/ngx…

以太坊和EOS DApp数量上升
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 目前,在最受欢迎的智能合约平台以太坊和EOS上,每月大约有180个新的去中心化应用程序(DApps),该数量处于历史最高…

转载iOS开发中常见的警告及错误
iOS警告收录及科学快速的消除方法 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作。其实大部分的警告都是…

数学思想 —— 低维与高维的统一
在平面几何有勾股定理:“假设三角形ABC的两边AB、AC互相垂直,则有关系: AB2AC2BC2当我们拓展到空间,类比平面几何的勾股定理并研究三棱锥的侧面面积与底面面积的关系时,我们可得到相应结论:假设三棱锥A-BCD…

python键_在Python中创建键命令
我正在根据我在网上找到的一个脚本编写我自己的简单键记录器。但是,我正在尝试编写一个键命令,以便在键入此命令时记录器程序将关闭。我该怎么做?(我也知道它一点也不安全,但这与这个程序无关) 例如&#x…

对标以太坊的EOS再火,也拼不过InterValue的区块链4.0
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 2017年6月26日上线的数字货币EOS,仅用5天时间,就融了1.85亿美元,一举打破ICO的融资记录。 至2018年4月12日&a…

python中ttk和tkinter_Python tkinter与ttk日历
我正在使用 this代码在我的Tkinter上创建一个简单的日历.当我在主根窗口上放置日历时,日历显示正常.因此,我决定放置另一个按钮,它将创建一个Tkinter顶层窗口并在顶层窗口上放置另外一个日历.但这次它无法显示日历,而是它给了我这个错误,“TclError:无法打包. 18913…

Ubuntu dns
在Ubuntu系统网络设备启动的流程中,会依赖/etc/network/interface的配置文件初始化网络接口,所以直接在/etc/network/interface之中配置好对应的dns服务器会最先写入/etc/resolv.conf。所以我们可以在其中添加如下内容: dns-nameserve…

web图片识别
<!doctype html><html lang"en"><head> <meta charset"UTF-8"> <title>图像识别</title> <script src"../js/jquery.js"></script></head><body><canvas id"canv…

通俗易懂,到底什么是区块链?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 2017年9月4日,中国政府正式明令禁止ICO和数字货币交易行为,随即关闭了多个数字货币交易所。同时政府也多次声明࿰…

select三级联动 怎么删除前一个的_python测试开发django57.xadmin选项二级联动
前言当我们选择项目分类的时候,一个项目下关联多个模块,同时有这两个选项框的时候,需要实现选中一个项目,模块里面自动删除出该项目下的模块,如下图这种解决基本思路:1.写个jqeury脚本监听change事件2.ajax…

安装wdcp的方法和bug
1.Wdcp安装SSH登录系统,这里讲解源码编译安装和RPM包安装两种 a.源码编译安装 下载源码包wget http://dl.wdlinux.cn:5180/lanmp_laster.tar.gz 解压并安装 tar zxvf lanmp_laster.tar.gz sh in.sh linux安装wdcp之后mysql找不到my.cnf,locate my-medium.cnf。 cp /…