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

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、合约地址和合约接口(ABI)是找到合约并调用合约的必要信息。
  • 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。

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

http://blog.sina.com.cn/s/blog_a93b83380102zb9z.html#cmt_5AAB2321-CA787956-167D58BCD-927-8FE

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

https://www.sohu.com/a/260072502_100271565

去中心化的区块链平台

https://www.sohu.com/a/243362789_797635/

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

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

https://www.jianshu.com/p/69237f98d43d?from=singlemessage

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

https://www.jianshu.com/p/884df9fb6767

区块链 以太坊 智能合约 运行原理和开发实例相关推荐

  1. 【以太坊智能合约】Embark Framework 开发基础篇

    在之前的文章中,我们看到了使用Solidity开发以太坊智能合约的所有基本知识.我们使用了以太坊钱包,我们能够轻松设置小型产品开发环境.我们会发现开始的时候很不错,但是如果我们想要更深入的话呢?我们要 ...

  2. 以太坊智能合约的原理和使用方法

    文章目录 一.智能合约概述 1.1 智能合约是什么 1.2 solidity语言 二.外部账户调用智能合约 三.一个合约调用另一个合约 3.1 直接调用 3.2 使用address类型的call()函 ...

  3. 以太坊智能合约ganache+truffle集成开发实验

    安装前的npm.node环境准备 更新apt可用软件包列表: sudo apt update 利用apt安装npm: sudo apt install npm -- 查看npm版本: npm --ve ...

  4. 区块链兼容以太坊智能合约

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 引言 随着区块链技术以及应用的普及,越来越多的区块链出现在大众视野中.由于区块链技术的开源特性,任何公司和个人都可以方便 ...

  5. 区块链开发(二)部署和运行第一个以太坊智能合约

    区块链开发(二)部署并运行第一个以太坊智能合约 李赫2016年8月22日 本文首发8BTC 网络上不少部署智能合约的文章,但是都有一个共同的特点,就是采用命令行的方式来部署,先是建立SOLC的编译环境 ...

  6. 区块链开发入门:基于以太坊智能合约构建 ICO DApp

    写给前端开发者的第一本区块链开发入门指南,通过从 0 到 1 实战开发一个 ICO DApp 项目(基于 V 神的 DAICO 设计思想),深入掌握区块链及以太坊技术. 为什么要选择区块链开发? 未来 ...

  7. 区块链安全-以太坊智能合约静态分析

    概述 目前,以太坊智能合约的安全事件频发,从The DAO事件到最近的Fomo3D奖池被盗,每次安全问题的破坏力都是巨大的,如何正确防范智能合约的安全漏洞成了当务之急.本文主要讲解了如何通过对智能合约 ...

  8. 区块链项目实战 - 使用以太坊/智能合约solidity,全栈开发区块链借贷记账小应用,含完整源码

    本文使用区块链平台以太坊+智能合约实现一个区块链记账的功能,具体为: 借款人和贷款人以及数额被记录在区块链中.使用区块链地址来表示借款人或者贷款人. 若一个借款人多次向一个贷款人借钱,更新所有的数额之 ...

  9. 带你玩转区块链--以太坊基础、发币、基于智能合约实现彩票项目-第二章-第一节【以太坊篇】

    意义: 在上一节知识学习中,我们已经了解如何实现一个基础区块链,并重构了BTC关键代码.对比传统的中心化项目,区块链项目拥有很多优势,如:追溯性.不可传篡改性.在中心化项目中的网络协议是:[数据层-- ...

  10. 区块链进阶-通过代币(Token)学以太坊智能合约-熊丽兵-专题视频课程

    区块链进阶-通过代币(Token)学以太坊智能合约-244人已学习 课程介绍         本课程从什么是代币(Token)讲起,分析实现一个代币关键的点是什么. 然后逐步扩展到实现标准ERC20代 ...

最新文章

  1. python怎么安装requests库-Python爬虫入门requests库的安装与使用
  2. sht20温湿度传感器原理图_温湿度传感器在孵化行业怎么应用
  3. 一个炒鸡好用的pdf阅读器
  4. 如何识别媒体偏见_描述性语言理解,以识别文本中的潜在偏见
  5. 单价数量和总价的公式_人教版四年级数学上册单价、数量和总价之间的关系微课...
  6. 命令行 编译 android6,Android: m, mm以及mmm编译命令以及make snod的使用
  7. etl 不能转换成date_java怎么将date类型转换成datetime类型
  8. android 3.10. 内核,编译android 3.10内核源码时出错
  9. Dummary、Fake、Stub、Spy、Mock
  10. 拓端tecdat|R语言时间序列:ARIMA / GARCH模型的交易策略在外汇市场预测应用
  11. vscode推荐插件的安装
  12. IDEA自动补全tab键向下选择s-tab向上选择
  13. 【工大SCIR】AAAI20 基于Goal(话题)的开放域多轮对话规划
  14. Layer Tree 绘制
  15. 北欧蓝rgb_2015年北欧游戏果酱
  16. Linux下Socket编程之TCP Server端
  17. 《Java基础——break与continue用法详解》
  18. VC欣赏、家人是阻力,极客化、国际化——90后创业生态
  19. HTTP权威指南读书笔记
  20. 2022年制冷与空调设备运行操作考试试题及模拟考试

热门文章

  1. Python 单例模式实现的五种方式
  2. 添加样式(后台给字段note(left,height-auto ))
  3. 常用的正则表达式(转)
  4. 【网络流24题】魔术球
  5. ecplise里的run as里只有run configurations是怎么回事?
  6. oracle数据库创建表空间和表临时空间
  7. Resource is out of sync with the file system
  8. VS2008中openGL开发环境配置
  9. 【视频】时间序列分析:ARIMA-ARCH / GARCH模型分析股票价格
  10. 拓端tecdat|R语言中回归模型预测的不同类型置信区间应用比较分析