深入浅出以太坊智能合约

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Eth(以太坊)不知道你有没有听说过,ICO你一定听说过。但你知道ICO其实是借助Eth的智能合约实现的吗?什么是智能合约,Eth为啥这么火?智能合约的特点是什么,我怎么写智能合约?基于智能合约还有Dapp,即分布式app,Dapp又是什么?本系列文章将全面讲述Ethereum的原理,特点和机制,以及涉及的各种概念。

Eth(以太坊)不知道你有没有听说过,ICO你一定听说过。但你知道ICO其实是借助Eth的智能合约实现的吗?什么是智能合约,Eth为啥这么火?智能合约的特点是什么,我怎么写智能合约?基于智能合约还有Dapp,即分布式app,Dapp又是什么?

本系列文章将全面讲述Ethereum的原理,特点和机制,以及涉及的各种概念。

区块链的运行机制

首先大家必须了解区块链。这里只做一个简单的描述,区块链就是一条全网账单链,链的使用者凭着自己的私钥加密交易内容,然后发送到网络上后,矿工通过比拼算力将内容加密提交到区块链上,同时获得使用者支付的手续费。

由于大家都在竞争加密内容,所以全网的算力都是使用者提交内容的见证人,因此区块链交易有迅速,不可逆的特点。

账户和消息传递

在区块链中的交易就是一个地址往另一个地址转移基本单位,Ethereum在这里将这种行为抽象成消息传递。每一次消息传递有发送者,也有接受者,消息内容可以是一笔交易,也有可能是一段信息。转账,其实就是一个消息传递。

在Ethereum中有两种账户,一种是人操作的正常账户,另一种是智能账户,正常账户中只有当前的Eth钱数,而智能账户中存储了两个东西:状态和代码,每当收到相应的消息时,这些代码就会被执行,从而改变其状态。这些账户也就是所谓的智能合约的载体。

这些智能账户就是智能合约的基础,要了解智能合约是怎么执行的,先要了解EVM。

EVM

前面提到了,真正的计算是在各个矿工的电脑中进行的。Ethereum的改进之处,就是在矿工收集足够消息,准备加密生成一个Block时,必须启动一个运行时环境,也就是EVM,来运行智能账户收到消息时对应的代码。

这个环境包含了一些内置变量,比如当前Block的Number,消息来源的地址等,还会提供一些API,一个stack供智能合约执行时使用。

通过EVM运行代码后,智能账户的状态发生了变化,然后矿工将这些状态同正常账户里的资金变化一起,加密生成新的block,链接到全网账单上。因此一个交易只会在一个Block里出现,并且要得到大多数算力的确认才能挂载,所以可以保证这些code执行的唯一性和正确性。

智能合约的示例

概念有时候比较晦涩,我们举一个募捐的智能合约的例子来帮助理解:

假设我们想向全网用户发起募捐,那就先可以定义一个智能账户,它有三个状态:当前募捐总量,捐款目标和被捐赠人的地址,然后给它定义两个函数:

接收募捐函数

接收募捐函数每次收到发过来的转账请求,先核对下发送者是否有足够多的钱(EVM会提供发送请求者的地址,程序可以通过地址获取到该人当前的区块链财务状况。)然后每次募捐函数调用时,都会比较下当前募捐总量跟捐款目标的比较,如果超过目标,就把当前收到的捐款全部发送到指定的被捐款人地址,否则的话,就只更新当前募捐总量状态值。

捐款函数

将所有捐款发送到保存的被捐赠人地址,并且将当前捐款总量清零。

每一个想要募捐的人,用自己的eth地址向该智能账户发起一笔转账,并且指明了要调用接受其募捐函数。

于是我们就有一个募捐智能合约啦,人们可以往里面捐款,达到限额后钱会自动发送到指定账户,全世界的矿工都在为这个合约进行计算和担保,不再需要人去盯着看有没有被挪用,这就是智能合约的魅力所在。

Ethereum最核心的智能合约机制大概就是这样,其实也并不复杂,接下来我们还会讲一下,ICO是怎么借助智能合约实现的,其实原理非常简单,等你明白了你一定会大吃一惊。

原文:http://baijiahao.baidu.com/s?id=1576362675066362360&wfr=spider&for=pc

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

如果你希望高效的学习以太坊DApp开发,可以访问汇智网提供的最热门在线互动教程:

1. 适合区块链新手的以太坊DApp智能合约实战入门教程
2. 区块链+IPFS+Node.js+MongoDB+Express去中心化以太坊电商应用开发实战

3. 其他更多内容也可以访问这个以太坊博客

相关文章
|
区块链
DAPP智能合约系统丨DAPP智能合约系统开发成功案例分析丨DAPP智能合约源码平台
QueryContract(contractName,method string,kvs[]*common.KeyValuePair,timeout int64)(*common.TxResponse,error)
|
Web App开发 开发框架 安全
以太坊–智能合约开发介绍及环境搭建
智能合约(Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。 智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。...
964 0
以太坊–智能合约开发介绍及环境搭建
|
存储 机器学习/深度学习 人工智能
智能合约简介
智能合约远胜于传统交易流程,因为它们有可能实现自动化,在某些情况下,甚至可以完全取代整个行业。同时,智能合约使交易更加公平、透明和安全。但是,除了实现自动化和改进单一的交易过程之外,智能合约还能发挥更大的作用。
457 0
智能合约简介
|
存储 JavaScript 前端开发
【智能合约】Solidity 基础知识 | 以太坊智能合约编程语言
目录 注意事项 编译器选择 一些说明 1. 变量 1.1 状态变量 1.2 局部变量 2. 数据类型 2.1 值类型 2.1.1 布尔类型(Booleans): 2.1.2 整型(Integers): 2.1.3 定长浮点型(Fixed Point Numbers): 2.1.4 定长字节数组(Fixed-size byte arrays) 2.1.5 有理数和整型常量(Rational and Integer Literals) 2.1.6 枚举(Enums) 2.1.7 函数类型(Function Types) 修饰符 函数定义 函数返回值 构造函数 2.1.8 地址类型(Address)
411 0
【智能合约】Solidity 基础知识 | 以太坊智能合约编程语言
|
区块链
以太坊之dapp
以太坊之dapp
|
JavaScript 算法 前端开发
以太坊教程:入门学习开发以太坊dapp
一、区块链 1. 分布式去中心化 比特币设计的初衷就是要避免依赖中心化的机构,没有发行机构,也不可能操纵发行数量。既然没有中心化的信用机构,在电子货币运行的过程中,也势必需要一种机制来认可运行在区块链上的行为(包括比特币的运营,亦或是运行在区块链上的其他业务),这种机制就是共识机制。
2705 0
|
存储 区块链 编译器
以太坊智能合约简介(Solidity)
本文略过了冗杂介绍,直接下沉到代码示例。本文中包含一个存储实例和生成极简单 subcurrency 的实例
|
前端开发 JavaScript 区块链
以太坊智能合约开发入门
以太坊合约就是以太坊区块链特定账户地址上的一串代码(functions)和数据(state)。合约账户不仅可以相互间通讯,还可以执行几乎所有的图灵完备计算。以太坊区块链上的合约代码是特定的二进制形式,被称作以太坊虚拟机(EVM)二进制代码。本文以最受欢迎的Solidity为例说明以太坊开发如何入门。
5584 0
|
移动开发 前端开发 JavaScript
开发基于以太坊智能合约的DApp
最近要找个H5的前端写个简单的DApp,聊过几个H5的工程师,都被跟以太坊交互的部分吓住了。虽然网上有N多的教程,但是对于H5工程师来说,还是有些困难。分析其原因,在于不了解ganache-cli(原来叫testrpc)/web3/以太坊节点/metamask之间的架构关系。
1588 0