EVM原理及其功能扩展
EVM运行机制概述
EVM即以太坊虚拟机,用于执行智能合约。智能合约可用高级开发语言Solidity进行开发,合约源代码经过编译得到可在EVM中运行的字节码。在部署合约、与合约交互的时候,字节码都是以16进制字符串形式传递和展现。
EVM运行过程中,其本身并不是一个独立的协程、线程更不是进程,它只是交易处理的一部分,在交易处理过程中以函数方式被调用。
调用路径为:StateProcessor.Process --> core.ApplyTransaction(初始化evm对象) --> StateTransition.TransitionDb() --> 根据交易类型执行 evm.Create 或 evm.Call。
在evm.Create中会执行相关验证、转账、初始化Contract对象并调用 run 函数开始执行合约代码,执行成功后获得返回值也就是要存储到链上的合约代码,将返回值存储到链上。
而evm.Call既是调用入口,同时它本身也是一个可递归的函数,在合约字节码中指令 0xf1 即代表CALL操作,在CALL操作中会递归调用evm.Call。在evm.Call中会执行验证及转账、从数据库获取合约代码初始化Contract对象、并调用 run 函数开始执行合约代码这些处理。
重要:上述"从数据库获取合约代码初始化Contract对象"意味着,给合约账户进行转账时,合约账户所关联的合约代码将会被执行。
在合约代码中,会固定包含检查转账金额的逻辑,如果金额大于0,则会执行合约的fallback函数。
如果合约没有fallback函数,或者fallback函数没有payable修饰符,则代码执行会抛异常,从而交易失败。