合约的存储:
合约在部署时, 就会创建一个合约账户, 合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户 codehash 指向的存储区域;codeHash 是代码的 hash 值,创建后不可更改。
再次, 数据主要存储在账户 storageRoot 指向的存储区域;storageRoot 对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。
最后, 所有的基础存储目前都基于 leveldb, 一种 kv 数据库。
搬运:?
以太坊智能合约的生命周期_跨链技术践行者-CSDN博客_智能合约生命周期
推荐:以太坊智能合约的生命周期_跨链技术践行者-CSDN博客_智能合约生命周期? ?详细介绍了合约存储、创建、部署、执行、升级、销毁
1、开发
开发人员使用不同的高级语言来编写智能合约,但是使用最多、最为活跃的,以及很多程序分析和漏洞挖掘工作都是面向Solidity来实现的。
2、编译
将各种高级语言编写的智能合约的源代码编译为能够在以太坊虚拟机上运行的字节码(bytecode),同时还会生成相应的合约调用接口ABI,该接口定义了合约所有可以被调用的外部函数和参数列表。
3、部署
编译之后的智能合约字节码需要被部署 在以太坊区块链平台中。合约的部署通常由一笔合约 部署交易来完成, 其中交易的数据(data)字段将被设 置为合约部署字节码, 而交易的接收方被设置为空。 矿工在进行交易打包时, 将会按照交易发送者的地址 (address)和交易序列号(nonce)信息来生成一个新的地址, 并将合约的字节码部署到该地址。这个新生成的地址就是合约地址, 是合约的唯一识别, 之后对于该合约的所有操作都将使用这个地址进行。
4、调用
a.交易调用,由普通账户发起一笔合约调用交易。
b.消息调用,由某个合约发起对另一个合约中函数的调用,合约之间的调用参数不会留在区块链数据中。
5、销毁
以太坊允许合约进行“自我销毁”, 不 过并不是所有的合约都可以销毁, 而是需要开发者 在进行合约编写时加入该功能。开发者在编写合约 时, 可以规定合约在达到特定的条件时进行销毁。合 约在执行过程中, 到达提前设置的条件, 便会进行 自我销毁。需要注意的是, 由于区块链数据都是公开 且不可篡改的, “销毁”只是意味着该合约在当前的 区块状态(state)中被标记为删除, 且不能被后续调 用, 但并不意味着合约代码和 Storage 存储被删除。 相反, 通过遍历并执行历史上的以太坊交易, 任何 被“销毁”的合约及其 Storage 存储都可以被恢复和 查看。合约一旦销毁便不可再被调用, 因此销毁功能 的调用必须进行足够的权限设置, 否则可能会被攻 击者恶意销毁而产生拒绝服务攻击。
搬运自:
倪远东,张超,殷婷婷.智能合约安全漏洞研究综述[J].信息安全学报,2020,5(03):78-99.
|