EVM虚拟机入门汇编入门(一)
基础介绍
- EVM虚拟机入门汇编入门(一)
- 前言
- 一、EVM虚拟机是什么?
- 二、EVM的燃料(Gas)机制是如何防止网络攻击的,它的定价机制是怎样的?EVM的燃料(Gas)机制是一种经济手段,用于防止网络攻击和资源滥用。通过为计算资源定价,Gas机制确保了以太坊网络的安全性和效率。以下是Gas机制如何防止网络攻击和它的定价方式:
- 三,虚拟机与指令集合二进制代码
-
- [1.remix 编译环境](#1.remix 编译环境)
- 2.hello合约入门
- 3.编译部署合约
- 4.分析数据
前言
EVM虚拟机的指令以及基本的内容,文章涉及不会太深,初步理解并用汇编的方式编译一份智能合约
一、EVM虚拟机是什么?
EVM(以太坊虚拟机)是一个分布式的虚拟机,它在以太坊区块链上运行智能合约。EVM是图灵完备的,这意味着它可以执行任何可以被编码为程序的计算任务。以下是EVM的一些关键特性和功能:
-
分布式架构:EVM由以太坊网络中的每个节点运行,确保了智能合约的执行和状态的一致性。
-
智能合约执行:智能合约是自执行的合约,其条款直接编写在代码中。EVM提供了执行这些合约的运行环境。
-
图灵完备:EVM能够执行任何计算,只要这些计算可以用算法表达。
-
确定性:EVM确保在所有节点上执行相同的操作时得到相同的结果,这对于区块链的安全性和可靠性至关重要。
-
隔离性:每个智能合约在EVM中运行时都是相互隔离的,这意味着它们不能访问其他合约的状态,除非通过合约间的明确调用。
-
燃料(Gas)机制:EVM使用燃料(Gas)来计量执行操作的成本。这是以太坊网络防止垃圾邮件和DoS攻击的一种机制。
-
字节码执行:智能合约通常以高级语言编写,如Solidity或Vyper,然后编译成EVM字节码,这是EVM能够理解和执行的低级指令集。
-
存储管理:EVM管理智能合约的状态,包括存储在区块链上的变量和数据结构。
-
消息调用:智能合约可以通过发送消息来相互调用,这允许复杂的合约逻辑和交互。
-
事件日志:EVM支持事件日志,这是智能合约用来记录状态变化的一种机制,可以被外部监听和查询。
-
跨链互操作性:EVM设计允许它与其他区块链网络进行互操作,例如通过使用跨链桥接技术。
EVM是区块链技术的核心组成部分,它使得去中心化应用(DApps)的创建成为可能,这些应用可以执行复杂的逻辑,同时保持透明性、安全性和去中心化的特性。随着区块链技术的发展,EVM也在不断地进化,以支持更高效、更安全的智能合约执行。
二、EVM的燃料(Gas)机制是如何防止网络攻击的,它的定价机制是怎样的?EVM的燃料(Gas)机制是一种经济手段,用于防止网络攻击和资源滥用。通过为计算资源定价,Gas机制确保了以太坊网络的安全性和效率。以下是Gas机制如何防止网络攻击和它的定价方式:
-
防止滥用和网络攻击:Gas作为一种计量单位,用于衡量执行交易或智能合约所需的计算工作量。每笔交易和智能合约执行都需要消耗Gas,用户必须为这些资源付费,从而防止了恶意用户发起大量无意义的交易来攻击网络。
-
动态定价机制:EVM的Gas价格(Gas Price)是用户愿意为每单位Gas支付的价格,而Gas限额(Gas Limit)是用户愿意为一笔交易支付的最大Gas数量。用户可以通过设置Gas价格和Gas限额来控制他们愿意支付的最大费用。
-
EIP-1559改进:EIP-1559提案对Gas机制进行了改进,引入了基础费(Base Fee)和优先费(Tip)。基础费根据网络拥堵情况动态调整,而优先费是用户给矿工的额外费用,以加快交易处理速度。这种机制使得Gas费用更加合理,并减少了波动性。
-
激励矿工:Gas费用作为矿工的奖励,激励他们进行交易验证和区块生成,保障区块链网络的正常运行。
-
资源管理:通过动态调整Gas价格和Gas限额,确保网络在高负载时能够有效管理资源,保持运行效率。
-
GasToken:GasToken是一种利用EVM Gas机制的创新方式,允许用户在Gas价格较低时"铸造"GasToken,然后在Gas价格上涨时使用它们来支付交易费用,从而节省成本。
-
多维Gas定价:Vitalik在新文中提出多维Gas定价的概念,考虑了不同类型的工作量,如原始计算、存储读写等,并为每种类型分配不同的Gas成本,以更精确地反映资源的使用情况。
通过这些机制,EVM的Gas系统不仅防止了网络攻击,还提高了以太坊的可扩展性和资源分配的效率。
三,虚拟机与指令集合二进制代码
1.remix 编译环境
Remix是一个开源的、基于浏览器的集成开发环境(IDE),专为智能合约的开发而设计。它提供了编译、部署至本地或测试网络以及执行智能合约等功能,非常适合Solidity智能合约的开发 。Remix支持所有知识水平的用户,并具有直观的图形用户界面(GUI)以及丰富的插件集,无需任何设置即可促进快速开发周期 。
使用Remix开发智能合约的基本流程如下:
-
环境设置:无需安装,直接在浏览器中启动Remix。它支持Firefox、Chrome和Brave浏览器,但不推荐在平板电脑或移动设备上使用 。
-
编写合约 :在Remix中创建一个新的
.sol
文件,并编写智能合约代码。例如,可以创建一个简单的代币合约,该合约包含创建代币和转移代币的功能 。 -
编译合约:在Remix中,智能合约默认设置会自动编译。只要编译旁边没有出现红色的错误提示,就表示编译成功 。
-
部署合约:选择要部署的合约,根据合约内容输入必要的参数(例如初始供应量),然后点击"create"按钮发送交易以部署合约 。
-
执行合约功能:合约部署成功后,Remix会根据合约内容自动生成对应的使用界面。用户可以通过这个界面调用合约中的函数,如查询余额或转移代币 。
-
测试网络部署:为了在测试网络上部署合约,需要安装MetaMask浏览器扩展,并将其网络设置为测试网络。然后可以在Remix中选择Injected Web3环境,通过MetaMask连接测试网络并部署合约 。
-
使用插件:Remix允许用户添加各种插件,如Solidity编译器、部署和运行事务的插件以及Solidity单元测试插件,以增强开发体验 。
Remix IDE是智能合约开发者的有力工具,特别是对于初学者来说,它提供了一个易于上手且功能全面的环境来编写、测试和部署智能合约 。
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版本。下面是对这段代码的详细分析:
-
许可证声明:
solidity// SPDX-License-Identifier: MIT
这一行是一个许可证标识符,用于声明智能合约使用的许可证类型。MIT许可证是一种广泛使用的开源许可证,它允许用户自由使用、复制、修改、合并、出版发行、散布、再授权和/或出售软件及其副本。
-
Solidity版本声明:
soliditypragma solidity 0.8.20;
这一行指定了智能合约使用的Solidity编译器的版本。
0.8.20
是这个合约兼容的版本号,这意味着只有使用这个版本的Solidity编译器才能正确编译此合约。 -
合约声明:
soliditycontract Hello {
这行代码声明了一个名为
Hello
的智能合约。 -
私有状态变量:
soliditystring private _hello;
这里定义了一个名为
_hello
的私有状态变量,它的类型是string
。状态变量在区块链上永久存储,并且private
关键字表示这个变量只能在合约内部访问。 -
公共状态变量:
solidityaddress who;
这行代码定义了一个名为
who
的公共状态变量,它的类型是address
。在Solidity中,address
类型用于存储以太坊地址。公共状态变量可以在合约外部被访问和修改。 -
公共函数:
solidityfunction hello() public {
这是一个名为
hello
的公共函数,它可以被外部调用。public
关键字表示这个函数可以被任何外部调用者访问。 -
函数内部逻辑:
solidity_hello = "Hello";
这行代码为私有变量
_hello
赋值为字符串"Hello"
。soliditywho = msg.sender;
这行代码将
who
变量设置为调用这个函数的地址。msg.sender
是一个全局变量,它表示当前调用交易的发送者。 -
合约结束:
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项),将抛出异常,状态变化同样会被撤销。