首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

区块链研究实验室-深入了解Solidity如何在以太坊VM上运行-第一节

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180803A08VU000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券