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