Solidity提供了许多高级语言抽象,但这些功能使我很难理解程序运行时的实际情况。阅读Solidity文档仍然让我对基本的东西感到困惑。
tring,bytes32,byte [],bytes之间有什么区别?
我何时使用哪一个?
当我将字符串转换为字节时发生了什么?我可以转换为byte []吗?
他们花了多少钱?
EVM如何存储映射?
为什么我不能删除映射?
我可以映射映射吗?(但是这有什么作用?)
为什么存储映射,但没有内存映射?
编译合同如何看待EVM?
合同是如何创建的?
什么是构造函数?
什么是回滚功能?
我认为学习像Solidity这样的高级语言如何在以太坊VM(EVM)上运行是一项很好的投资。
EVM是一个数据库引擎。要了解智能合约在任何EVM语言中的工作方式,您必须了解数据的组织,存储和操作方式。
在一系列文章中,了解构简单的Solidity契约,以了解它如何作为EVM字节码工作。
内容概述:
EVM字节码的基础知识。
如何表示不同的类型(映射,数组)。
创建新合同时发生了什么。
调用方法时发生了什么。
ABI如何桥接不同的EVM语言。
我的最终目标是能够完整地理解已编译的Solidity合同。让我们从阅读一些基本的EVM字节码开始吧!
一份简单的智能合同,我们的第一个契约有一个构造函数和一个状态变量:
// c1.sol
pragma solidity ^0.4.11;
contract C {
uint256 a;
function C() {
a =1;
}
}
使用solc编译此合同:
$ solc --bin --asm c1.sol
======= c1.sol:C =======
EVM assembly:
/* "c1.sol":26:94 contract C {... */
mstore(0x40,0x60)
/* "c1.sol":59:92 function C() {... */
jumpi(tag_1, iszero(callvalue))
0x0
dup1
revert
tag_1:
tag_2:
/* "c1.sol":84:85 1 */
0x1
/* "c1.sol":80:81 a */
0x0
/* "c1.sol":80:85 a = 1 */
dup2
swap1
sstore
pop
/* "c1.sol":59:92 function C() {... */
tag_3:
/* "c1.sol":26:94 contract C {... */
tag_4:
dataSize(sub_0)
dup1
dataOffset(sub_0)
0x0
codecopy
0x0
return
stop
sub_0: assembly {
/* "c1.sol":26:94 contract C {... */
mstore(0x40,0x60)
tag_1:
0x0
dup1
revert
auxdata:0xa165627a7a72305820af3193f6fd31031a0e0d2de1ad2c27352b1ce081b4f3c92b5650ca4dd542bb770029
}
Binary:
60606040523415600e57600080fd5b5b60016000819055505b5b60368060266000396000f30060606040525b600080fd00a165627a7a72305820af3193f6fd31031a0e0d2de1ad2c27352b1ce081b4f3c92b5650ca4dd542bb770029
领取专属 10元无门槛券
私享最新 技术干货