EVM虚拟机入门汇编入门(一)

EVM虚拟机入门汇编入门(一)

基础介绍


前言

EVM虚拟机的指令以及基本的内容,文章涉及不会太深,初步理解并用汇编的方式编译一份智能合约

一、EVM虚拟机是什么?

EVM(以太坊虚拟机)是一个分布式的虚拟机,它在以太坊区块链上运行智能合约。EVM是图灵完备的,这意味着它可以执行任何可以被编码为程序的计算任务。以下是EVM的一些关键特性和功能:

  1. 分布式架构:EVM由以太坊网络中的每个节点运行,确保了智能合约的执行和状态的一致性。

  2. 智能合约执行:智能合约是自执行的合约,其条款直接编写在代码中。EVM提供了执行这些合约的运行环境。

  3. 图灵完备:EVM能够执行任何计算,只要这些计算可以用算法表达。

  4. 确定性:EVM确保在所有节点上执行相同的操作时得到相同的结果,这对于区块链的安全性和可靠性至关重要。

  5. 隔离性:每个智能合约在EVM中运行时都是相互隔离的,这意味着它们不能访问其他合约的状态,除非通过合约间的明确调用。

  6. 燃料(Gas)机制:EVM使用燃料(Gas)来计量执行操作的成本。这是以太坊网络防止垃圾邮件和DoS攻击的一种机制。

  7. 字节码执行:智能合约通常以高级语言编写,如Solidity或Vyper,然后编译成EVM字节码,这是EVM能够理解和执行的低级指令集。

  8. 存储管理:EVM管理智能合约的状态,包括存储在区块链上的变量和数据结构。

  9. 消息调用:智能合约可以通过发送消息来相互调用,这允许复杂的合约逻辑和交互。

  10. 事件日志:EVM支持事件日志,这是智能合约用来记录状态变化的一种机制,可以被外部监听和查询。

  11. 跨链互操作性:EVM设计允许它与其他区块链网络进行互操作,例如通过使用跨链桥接技术。

EVM是区块链技术的核心组成部分,它使得去中心化应用(DApps)的创建成为可能,这些应用可以执行复杂的逻辑,同时保持透明性、安全性和去中心化的特性。随着区块链技术的发展,EVM也在不断地进化,以支持更高效、更安全的智能合约执行。

二、EVM的燃料(Gas)机制是如何防止网络攻击的,它的定价机制是怎样的?EVM的燃料(Gas)机制是一种经济手段,用于防止网络攻击和资源滥用。通过为计算资源定价,Gas机制确保了以太坊网络的安全性和效率。以下是Gas机制如何防止网络攻击和它的定价方式:

  1. 防止滥用和网络攻击:Gas作为一种计量单位,用于衡量执行交易或智能合约所需的计算工作量。每笔交易和智能合约执行都需要消耗Gas,用户必须为这些资源付费,从而防止了恶意用户发起大量无意义的交易来攻击网络。

  2. 动态定价机制:EVM的Gas价格(Gas Price)是用户愿意为每单位Gas支付的价格,而Gas限额(Gas Limit)是用户愿意为一笔交易支付的最大Gas数量。用户可以通过设置Gas价格和Gas限额来控制他们愿意支付的最大费用。

  3. EIP-1559改进:EIP-1559提案对Gas机制进行了改进,引入了基础费(Base Fee)和优先费(Tip)。基础费根据网络拥堵情况动态调整,而优先费是用户给矿工的额外费用,以加快交易处理速度。这种机制使得Gas费用更加合理,并减少了波动性。

  4. 激励矿工:Gas费用作为矿工的奖励,激励他们进行交易验证和区块生成,保障区块链网络的正常运行。

  5. 资源管理:通过动态调整Gas价格和Gas限额,确保网络在高负载时能够有效管理资源,保持运行效率。

  6. GasToken:GasToken是一种利用EVM Gas机制的创新方式,允许用户在Gas价格较低时"铸造"GasToken,然后在Gas价格上涨时使用它们来支付交易费用,从而节省成本。

  7. 多维Gas定价:Vitalik在新文中提出多维Gas定价的概念,考虑了不同类型的工作量,如原始计算、存储读写等,并为每种类型分配不同的Gas成本,以更精确地反映资源的使用情况。

通过这些机制,EVM的Gas系统不仅防止了网络攻击,还提高了以太坊的可扩展性和资源分配的效率。

三,虚拟机与指令集合二进制代码

1.remix 编译环境

Remix是一个开源的、基于浏览器的集成开发环境(IDE),专为智能合约的开发而设计。它提供了编译、部署至本地或测试网络以及执行智能合约等功能,非常适合Solidity智能合约的开发 。Remix支持所有知识水平的用户,并具有直观的图形用户界面(GUI)以及丰富的插件集,无需任何设置即可促进快速开发周期 。

使用Remix开发智能合约的基本流程如下:

  1. 环境设置:无需安装,直接在浏览器中启动Remix。它支持Firefox、Chrome和Brave浏览器,但不推荐在平板电脑或移动设备上使用 。

  2. 编写合约 :在Remix中创建一个新的.sol文件,并编写智能合约代码。例如,可以创建一个简单的代币合约,该合约包含创建代币和转移代币的功能 。

  3. 编译合约:在Remix中,智能合约默认设置会自动编译。只要编译旁边没有出现红色的错误提示,就表示编译成功 。

  4. 部署合约:选择要部署的合约,根据合约内容输入必要的参数(例如初始供应量),然后点击"create"按钮发送交易以部署合约 。

  5. 执行合约功能:合约部署成功后,Remix会根据合约内容自动生成对应的使用界面。用户可以通过这个界面调用合约中的函数,如查询余额或转移代币 。

  6. 测试网络部署:为了在测试网络上部署合约,需要安装MetaMask浏览器扩展,并将其网络设置为测试网络。然后可以在Remix中选择Injected Web3环境,通过MetaMask连接测试网络并部署合约 。

  7. 使用插件:Remix允许用户添加各种插件,如Solidity编译器、部署和运行事务的插件以及Solidity单元测试插件,以增强开发体验 。

Remix IDE是智能合约开发者的有力工具,特别是对于初学者来说,它提供了一个易于上手且功能全面的环境来编写、测试和部署智能合约 。

remix网址

remix

2.hello合约入门

请到remix编译我们的代码,

代码如下:

solidity 复制代码
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
contract Hello{
    string private _hello ;
    address who;
    function hello()public {
        _hello = "Hello";
        who=msg.sender;
    }
}

这段代码是一个简单的Solidity智能合约示例,使用了Solidity语言的0.8.20版本。下面是对这段代码的详细分析:

  1. 许可证声明

    solidity 复制代码
    // SPDX-License-Identifier: MIT

    这一行是一个许可证标识符,用于声明智能合约使用的许可证类型。MIT许可证是一种广泛使用的开源许可证,它允许用户自由使用、复制、修改、合并、出版发行、散布、再授权和/或出售软件及其副本。

  2. Solidity版本声明

    solidity 复制代码
    pragma solidity 0.8.20;

    这一行指定了智能合约使用的Solidity编译器的版本。0.8.20是这个合约兼容的版本号,这意味着只有使用这个版本的Solidity编译器才能正确编译此合约。

  3. 合约声明

    solidity 复制代码
    contract Hello {

    这行代码声明了一个名为Hello的智能合约。

  4. 私有状态变量

    solidity 复制代码
    string private _hello;

    这里定义了一个名为_hello的私有状态变量,它的类型是string。状态变量在区块链上永久存储,并且private关键字表示这个变量只能在合约内部访问。

  5. 公共状态变量

    solidity 复制代码
    address who;

    这行代码定义了一个名为who的公共状态变量,它的类型是address。在Solidity中,address类型用于存储以太坊地址。公共状态变量可以在合约外部被访问和修改。

  6. 公共函数

    solidity 复制代码
    function hello() public {

    这是一个名为hello的公共函数,它可以被外部调用。public关键字表示这个函数可以被任何外部调用者访问。

  7. 函数内部逻辑

    solidity 复制代码
    _hello = "Hello";

    这行代码为私有变量_hello赋值为字符串"Hello"

    solidity 复制代码
    who = msg.sender;

    这行代码将who变量设置为调用这个函数的地址。msg.sender是一个全局变量,它表示当前调用交易的发送者。

  8. 合约结束

    solidity 复制代码
    }

    这行代码标记了Hello合约的结束。

总结来说,这个Hello智能合约定义了一个私有字符串变量和一个公共地址变量,以及一个公共函数hello,当这个函数被调用时,它会设置私有变量_hello"Hello",并将调用者的地址赋值给公共变量who

3.编译部署合约

编译合约:

部署合约:

我们可以看到终端有一些输出 :

如下:

bash 复制代码
0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c806319ff1d211461002d575b5f80fd5b610035610037565b005b6040518060400160405280600581526020017f48656c6c6f0000000000000000000000000000000000000000000000000000008152505f908161007a91906102f7565b503360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061013857607f821691505b60208210810361014b5761014a6100f4565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101ad7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610172565b6101b78683610172565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6101fb6101f66101f1846101cf565b6101d8565b6101cf565b9050919050565b5f819050919050565b610214836101e1565b61022861022082610202565b84845461017e565b825550505050565b5f90565b61023c610230565b61024781848461020b565b505050565b5b8181101561026a5761025f5f82610234565b60018101905061024d565b5050565b601f8211156102af5761028081610151565b61028984610163565b81016020851015610298578190505b6102ac6102a485610163565b83018261024c565b50505b505050565b5f82821c905092915050565b5f6102cf5f19846008026102b4565b1980831691505092915050565b5f6102e783836102c0565b9150826002028217905092915050565b610300826100bd565b67ffffffffffffffff811115610319576103186100c7565b5b6103238254610121565b61032e82828561026e565b5f60209050601f83116001811461035f575f841561034d578287015190505b61035785826102dc565b8655506103be565b601f19841661036d86610151565b5f5b828110156103945784890151825560018201915060208501945060208101905061036f565b868310156103b157848901516103ad601f8916826102c0565b8355505b6001600288020188555050505b50505050505056fea264697066735822122074ba9303c21b3c27cc6e524d6d849287240ad1b1d5c9306584f639a1f8b04a3d64736f6c63430008140033

4.分析数据

在网站https://www.evm.codes/上面可以看到关于这个数据的详细的操作码,我们可以看出60是一个叫做push1的指令,在以太坊虚拟机(EVM)中,"Frontier"是指以太坊最初的协议版本,它引入了基本的操作码和规则。"Push Operations"是EVM中的一种操作码,用于将数据推入执行栈。下面是对"Push Operations"的详细解释,以及如何根据你提供的示例在以太坊的在线游乐场(playground)中复现这一操作,并讨论可能的错误情况。

Push Operations

作用:将一定长度的数据直接推入EVM的执行栈。
格式:PUSHN,其中N是数据的字节数,范围通常是1到32。
栈操作:将数据推入栈顶,栈中的其他元素索引递增。

示例分析

Code:0x60FF6000
    0x60:PUSH1操作码,表示接下来将推入一个字节的数据。
    FF:要推入的数据,十六进制表示的255。
    6000:这是另一个操作码,可能是一个标签或注释,因为在字节码中并没有PUSH0操作码。

栈操作示例

Input(执行前栈状态):空栈。
Code:0x60FF
    Step 1:执行PUSH1 FF,将FF推入栈顶。
        Output:[0xFF]
    Step 2:接下来的指令(假设是PUSH1 00)将00推入栈顶。
        Output:[0x00, 0xFF]

错误情况

Not enough gas:如果交易的Gas不足,操作将不会执行,状态变化将被撤销。
Stack overflow:如果操作导致栈超过其最大容量(1024项),将抛出异常,状态变化同样会被撤销。
相关推荐
搬砖的小码农_Sky2 小时前
什么是零知识证明?
区块链·密码学·零知识证明
TinTin Land2 小时前
高活跃社区 Doge 与零知识证明的强强联手,QED 重塑可扩展性
区块链·零知识证明
xiaozhiwise10 小时前
ARM base instruction -- ccmp (immediate)
汇编
Roun318 小时前
去中心化存储:Web3中的数据安全新标准
web3·去中心化·区块链
请不要叫我菜鸡1 天前
分布式——一致性模型与共识算法
分布式·后端·区块链·raft·共识算法·zab
BlockOne111 天前
Meme 币生态全景图分析:如何获得超额收益?
大数据·人工智能·区块链
霸都小魔女1 天前
MT4交易的平仓与强制平仓有哪几种情况
大数据·人工智能·区块链
dingzd951 天前
Web3对社交媒体的影响:重新定义用户互动方式
web3·去中心化·区块链·媒体
复业思维202401082 天前
2024年10月第4个交易周收盘总结(10月收盘)
区块链
倾城璧2 天前
solidity中的Error和Modifier详解
区块链