主页 > 放imtoken钱包安全吗 > 在以太坊上部署和运行智能合约的一般流程
在以太坊上部署和运行智能合约的一般流程
在以太坊上部署和运行智能合约的一般流程
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。
参考:
#引用类型
(官方常见问题解答)
(分析的更深刻)