主页 > imtoken新版本 > 区块链以太坊智能合约运行原理及开发实例

区块链以太坊智能合约运行原理及开发实例

imtoken新版本 2023-04-03 06:12:55

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

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

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

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

2.开发步骤step1:启动以太坊节点

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

第二步:写

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

智能合约实例可以理解为一个对象,编写智能合约类似于编写一个类,可以在这个类中定义各种变量和函数。

这是一个简单的例子。 下面的代码是一个智能。 合同SimpleStorage 只包含一个变量storedData,以及set 和get 方法。

contract SimpleStorage {
    string storedData;

以太坊经典和以太坊_以太坊和以太币有什么区别_以太坊原理介绍

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

第三步:编译

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

step4:部署

通过以太坊客户端将编译好的合约代码上传部署到以太坊区块链中会消耗GAS,合约发起人需要用自己的所有外部账户签署待部署合约。 经矿工确认后,合约代码将存储在以太坊区块链上,智能合约被发送到所有连接到网络的设备。 在这一步中,用户可以获得合约的地址和调用合约所需的接口,以备后用。

以太坊和以太币有什么区别_以太坊原理介绍_以太坊经典和以太坊

以太坊和以太币有什么区别_以太坊原理介绍_以太坊经典和以太坊

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

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

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

第五步:打电话

使用web3.js库提供的JavaScript API接口调用合约。 这一步也消耗乙醚。

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

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

因此,以太坊网络中的节点接收到这些交易后,其中的EVM会执行相应的合约代码,最终各节点通过PoW或PoS等方式达成共识以太坊原理介绍,合约的内容和状态将是全网一致。

以太坊原理介绍_以太坊和以太币有什么区别_以太坊经典和以太坊

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

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

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

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

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

以太坊原理介绍_以太坊经典和以太坊_以太坊和以太币有什么区别

附言:

3.以太坊虚拟机EVM

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

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

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

智能合约也可以有限地访问其他智能合约,并在区块链网络上独立运行。

4.矿工的责任

以太坊矿工的职责是:

这些责任是由诚实的矿工来完成的,理性的矿工可能只会出块。

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

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

6、调用合约传入的参数存在哪里?

参数不一定,如果参数使用栈,则不保存,默认栈不是内存类型

data location,变量的存储位置属性。一共有三种

以太坊原理介绍_以太坊经典和以太坊_以太坊和以太币有什么区别

最后一类数据位置比较特殊。 一般只有外部函数的参数(不包括返回参数)被强制指定为calldata(大部分表现和内存一样)。 此数据位置是只读的,不会持久保存到区块链(即 leveldb)。

一般我们可以选择指定内存和存储。

内存存放位置类似于我们普通程序的内存。 即分配,即使用,超出范围,无法访问,等待回收。

对于存储变量,数据将一直存在于区块链上(持久化到硬盘)。

内存相当于栈的数据。 栈中的元素可以放在存储位置和内存位置。

一个合约中的局部(local)变量和状态(state)变量都存在于链上,即持久化在leveldb中。

7.深入分析

storage存储结构在合约创建时就确定了,它依赖于合约声明的状态变量。 但是可以通过(事务)调用更改内容(所有节点修改相同)。

Solidity 称之为状态变化,这就是为什么合约级变量被称为状态变量。 你也可以更好地理解为什么状态变量存储在存储中。

内存只能在函数内部使用,内存声明用于告诉EVM创建一个(固定大小)内存区域供变量在运行时使用。

Storage 在区块链中以 key/value 的形式存储,而 memory 则表示为字节数组

8.关于堆栈(stack)

EVM 是一种基于堆栈的语言。 栈其实就是内存中的一种数据结构。 每个栈元素占用256位,栈的最大长度为1024。

值类型的局部变量存储在堆栈中。

以太坊原理介绍_以太坊和以太币有什么区别_以太坊经典和以太坊

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

合约存储由以太坊实现。 开发者只需要根据合约地址和ABI调用合约的功能即可。

以太坊中的合约有点像服务器端程序,业务调用合约的接口就是这样。

交易数据存储在区块链上,账户状态数据存储在本地; 区块只保存区块最终实现的账户状态的默克尔根。

部署交易时,只需要携带合约的EVM字节码即可。 当合约源程序比较大时,对应的二进制代码也会很大。

用户发送特定交易(交易存储在某个区块),将合约部署到以太坊以太坊原理介绍,最终生成的合约地址(每个合约地址对应一个合约账户,即内部账户)为所有以太坊节点两者。

(合约账户只存储合约的EVM字节码(以太坊特有的二进制格式)。)

合约账户可以存储以太币; 存储智能合约的可执行字节码; 可以响应其他用户或合约的请求执行智能合约,并返回结果; 可以调用其他智能合约。

10、为什么比特币项目喜欢用leveldb? 有什么工程上的考虑吗?

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

在以太坊上部署和运行智能合约的一般流程

智能合约如此流行,你却不知道它是如何运作的?

去中心化区块链平台

2. 以太坊智能合约开发实例

什么是智能合约,以及智能合约的工作原理