主页 > 放imtoken钱包安全吗 > 在以太坊上部署和运行智能合约的一般流程

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

放imtoken钱包安全吗 2023-08-25 05:08:59

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

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

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

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

Step4:将编译好的合约代码部署到以太坊区块链会消耗GAS,合约发起人需要使用所有外部账户来签署待部署的合约。 经矿工确认后,合约代码将存储在区块链上的以太坊中。 在这一步中,用户可以获得合约的地址和调用合约所需的接口,以备后用。

ps:1、合约地址和合约接口(ABI)是查找和调用合约的必要信息。

2. 在以太坊上创建(或部署)合约是通过发送交易来完成的。

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

什么是以太坊智能合约_以太坊可以运行智能合约_以太坊智能合约安全性

以太坊中矿工的职责包括:接收、验证、传播、执行交易(ps:执行交易主要是调用合约交易)。 当然,还有接收块、验证块和传播块。 这些责任是由诚实的矿工来完成的,理性的矿工可能只会出块。

Q:智能合约的数据存在哪里?

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

Q:调用合约传入的参数存在哪里?

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

数据位置,变量的存储位置属性。 分为三种,memory(内存)、storage(持久化到硬盘)和calldata。

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

以太坊可以运行智能合约_什么是以太坊智能合约_以太坊智能合约安全性

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

内存存放位置类似于我们普通程序的内存。 即分配,即使用,超出范围,无法访问以太坊可以运行智能合约,等待回收。

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

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

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

深入分析

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

以太坊智能合约安全性_以太坊可以运行智能合约_什么是以太坊智能合约

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

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

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

关于栈

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

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

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

以太坊可以运行智能合约_什么是以太坊智能合约_以太坊智能合约安全性

storage 会永久保存合约状态变量,开销最大

内存只保存临时(temporary)变量,函数调用后释放,开销很小

栈中保存的是小局部变量(smalllocal variables),几乎可以随意使用,只是有数量限制。

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

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

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

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

什么是以太坊智能合约_以太坊智能合约安全性_以太坊可以运行智能合约

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

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

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

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

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

参考:

#引用类型

(官方常见问题解答)

(分析的更深刻)