博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
区块链 以太坊 智能合约 运行原理和开发实例
阅读量:2037 次
发布时间:2019-04-28

本文共 3452 字,大约阅读时间需要 11 分钟。

 

一、以太坊 智能合约的运行原理

1. 智能合约

智能合约是一种特殊协议,旨在提供、验证及执行合约。

具体来说,智能合约是区块链被称之为“去中心化的”重要原因,它允许我们在不需要第三方的情况下,执行可追溯、不可逆转和安全的交易。

 

在以太坊,记录在区块链账本里的不仅仅是账户余额,还有函数调用后变量的新状态。

 

 

2. 开发步骤

step1:  启动以太坊节点

启动一个以太坊节点(如Geth)

 

step2:编写

使用智能合约编程语言(如Solidity)编写智能合约(后缀为.sol)。

可以将一个智能合约实例理解成一个对象,编写一个智能合约类似于编写一个类,其可以在这个类里定义各种变量以及函数。

 

这里给出一个简单的例子。下面这段代码就是一个智能。合约SimpleStorage,里面只有一个变量storedData,以及set和get方法。

contract SimpleStorage {    string storedData;    function set(string s) {        storedData = s;    }    function get() constant returns (string) {        returnstoredData;    }}

 

 

step3:  编译

用solc编译器将.sol合约代码编译成EVM字节码。

 

 

step4:部署

通过以太坊客户端将编译好的合约代码上传部署到以太坊区块链需要消耗GAS,并且需要合约发起用户使用自己的外部所有账户对将要部署的合约进行签名,通过矿工确认后,将合约代码存于以太坊区块链上,即智能合约被发送到所有连接到网络的设备上。在这一步中,用户可获得合约的地址,以及调用合约所需的接口,以便之后使用。

 

图1-4展示了在以太坊网络中创建智能合约的过程。

当Bob将一个包含智能合约信息(如上例代码)的交易发送到以太坊网络中后,节点的EVM执行这个交易并生成对应的合约实例,图中的“0x6f8ae93..”代表了这个合约的地址。节点间通过共识机制达成一致后,这个合约就正式生效了,之后用户就可以调用SimpleStorage合约了。

 

当用户将这个智能合约发布到以太坊网络中时,相当于给这个类生成一个对象,合约发布之后用户会得到一个合约地址,相当于合约对象的指针。

 

 

 

step5:调用

使用web3.js库所提供的JavaScript API接口来调用合约。这一步也会消耗以太币。

当网络中的用户调用这个智能合约时,可以直接给这个合约地址发送“交易”,并声明本次调用的函数名称和参数,使得智能合约执行对应的逻辑。

 

无论发布还是调用智能合约,智能合约的信息都被附在“交易”中,以交易的形式发布到网络中。

因此以太坊网络中的节点接收到这些交易后,其中的EVM会执行对应的合约代码,最后各个节点通过PoW或PoS等达成共识,合约的内容和状态也就实现了全网一致

 

图1-5展示了在以太坊上调用智能合约的过程。

Bob同样以交易的形式在“To”字段填上SimpleStorage合约的地址,在“Data”字段填上调用的方法(set)和参数(“Hello”),就可以调用智能合约SimpleStorage,将其中的storedData设为“Hello”。节点收到这条交易后,通过EVM执行对应的操作,并通过共识机制实现以太坊网络上合约状态的改变。

之后,当Alice查看这个合约的变量时,就会发现这个合约中storedData变量的值变成了“Hello”。

由于查看的过程不涉及状态的修改,而且以太坊上数据是分布式的,网络中的每个节点都可以在本地保存一份完整的数据,因此Alice可以不通过交易的形式查看到这个变量的值。

--《以太坊技术详解与实战》

 

 
ps:
  • a、合约地址和合约接口()是找到合约并调用合约的必要信息。
  • b、在以太坊上创建(部署)、调用一个合约是通过发送一个交易完成的。

 

3. 太坊虚拟机EVM

以太坊虚拟机(EVM)是以太坊上智能合约的运行环境。

每个以太坊节点都运行着EVM。

 

它实际上是完全隔离的,这意味着在EVM上运行的代码无法访问网络、文件系统和其他进程。

智能合约对其他的智能合约的访问权也有限,在区块链网络上单独运作。

 

 
 

4. 矿工的职责

 
以太坊中miner的职责有:
  • 接收(receive)交易
  • 验证(verify)交易
  • 传播(propagate)交易
  • 执行(execute)交易(ps:执行交易主要是调用合约交易)。
  • 接收区块,
  • 验证区块,
  • 传播区块。
这些职责都是诚实矿工做的,理性矿工可能只是产生区块。
 
 
 
 

5. 智能合约的数据存在哪里的?

 
智能合约的数据(状态变量)存在区块链上。
 
 
 

6. 调用合约 传进来的参数存在哪里?

 
参数不一定,参数如果用的是栈那就不存,默认的栈是memory类型
 
数据位置,变量的存储位置属性。有三种类型
  • memory(内存)
  • storage(持久化到硬盘上)
  • calldata
  •  
最后一种数据位置比较特殊,一般只有外部函数的参数(不包括返回参数)被强制指定为calldata(大多数表现和memory一样)。这种数据位置是只读的,不会持久化到区块链(即leveldb中)。
 
一般我们可以选择指定的是memory和storage。
 
 
 
memory存储位置同我们普通程序的内存类似。即分配,即使用,越过作用域即不可被访问,等待被回收。
 
而对于storage的变量,数据将永远存在于区块链上(持久化到硬盘上)。
 
memory就相当于栈的数据。可以把栈里的元素放到storage位置和memory位置
 
一个合约里的局部(local)变量状态(state)变量都存在链上,即持久化到leveldb中了。
 
 

7. 深入分析

 
storage 存储结构是在合约创建的时候就确定好了的,它取决于合约所声明状态变量。但是内容可以被(交易)调用改变(所有的节点修改一样)
 
Solidity 称这个为状态改变,这也是合约级变量称为状态变量的原因。也可以更好的理解为什么状态变量都是storage存储。
 
memory 只能用于函数内部,memory 声明用来告知EVM在运行时创建一块(固定大小)内存区域给变量使用。
 
storage 在区块链中是用key/value的形式存储,而memory则表现为字节数组
 
 

8. 关于栈(stack)

 
EVM是一个基于栈的语言,栈实际是在内存(memory)的一个数据结构,每个栈元素占为256位,栈最大长度为1024。
 
值类型的局部变量是存储在栈上。
 
 

9. 不同存储的消耗(gas消耗)

 
  • storage 会永久保存合约状态变量,开销最大
  • memory 仅保存临时(temporary)变量,函数调用之后释放,开销很小
  • stack 保存很小的局部变量(small local variables),几乎免费使用,但有数量限制。
 
合约storage是以太坊帮我们实现好了。开发者只需要根据合约地址和ABI调用合约的函数就行。
 
以太坊里面的合约有点像服务端程序,业务调用合约的接口就是了。
 
交易数据存储在区块链上,账户的状态数据存储在本地;区块只保存该区块最终实现的账户状态的默克尔根。
 
部署交易的时候只需要携带合约的EVM字节码。当合约源程序比较大,相应的二进制码也会很大。
 
用户发送特定的交易(该交易被存储在某一区块里),部署合约到以太坊上,最后生成的合约地址(每一个合约地址对应一个合约账户,即内部账户)是所有的以太坊节点都有。
(合约账户只存合约的以太坊虚拟机字节码(一种以太坊专用的的二进制格式)。)
 
合约账户可以存储以太币;存储智能合约的可执行字节码;可响应别的用户或合约执行此智能合约的请求,并返回结果;可调用别的智能合约。
 
 
 

10. 为什么比特币这些项目喜欢用leveldb?是有哪些工程上的考量吗?

 
每个节点全量备份只能考虑嵌入式数据库。嵌入式数据库只有leveldb,rocksdb,sqlite。

 

 

在以太坊上部署和运行智能合约大致流程

 

智能合约这么火,但是你连它的执行原理都不知道?

 

去中心化的区块链平台 

 

二、以太坊 智能合约的开发实例

 

  • 使用案例:保险流程中的智能合约
  • 智能合约的好处
  • 安装先决条件
  • 配置Genesis Block
  • 运行以太坊专用网络
  • 创建以太坊帐户
  • 创建以太坊智能合约
  • 执行以太坊智能合约

 

 

 

什么是智能合约,智能合约运作原理详解

转载地址:http://uqkof.baihongyu.com/

你可能感兴趣的文章
JVM内存模型
查看>>
syslog日志记录
查看>>
Linux下的动态库.so
查看>>
jQuery解决input中placeholder值在ie中无法支持的问题
查看>>
一文深度揭秘Redis的磁盘持久化机制
查看>>
java是编译型还是解释型语言
查看>>
Spring的BeanUtils的copyProperties方法需要注意的点
查看>>
NotePad 常用快捷键总结
查看>>
Notepad++如何让打开的文件排在左边菜单栏
查看>>
File类的常用方法【二】
查看>>
Java nio 实现socket异步通信
查看>>
商品秒杀系统设计思路
查看>>
Java自带的JVM性能监控及调优工具(jps、jinfo、jstat、jmap、javap)使用介绍
查看>>
方法回调/钩子
查看>>
Java中常用缓存Cache机制的实现
查看>>
数据库设计规范化的 5 个要求
查看>>
手动启动 oracle 服务
查看>>
二 垃圾回收:第06讲:深入剖析:垃圾回收你真的了解吗?(下)
查看>>
ObjectMapper 的一些坑
查看>>
spring 几种获得bean的方法
查看>>