1. 智能合约介绍

今天是手把手教你写智能合约的第一天,今天会介绍一下开发智能合约使用到的编程语言,还有以太坊虚拟机EVM的底层结构。

之后的课程会教大家开发智能合约的细节,包括编程语言的语法细节,常见的智能合约漏洞,编译,部署的到以太坊公链上,还有gas费的消耗机制,还有常见的智能合约协议,ERC20、ERC721、ERC1155...,以及如何使用nodejs开发一个智能合约应用。

1. 使用的语言

其实开发智能合约的编程语言有很多种,不过大部分都使用solidity来进行开发,我就给大家重点介绍一下solidity语言。

下面给大家分享一些solidity的在线文档,还有线上编译器

solidity中文文档:https://learnblockchain.cn/docs/solidity/
solidity在线编译器:https://remix.ethereum.org/
github: https://github.com/ethereum/solidity

1.1 solidity介绍

Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。智能合约是管理以太坊状态里账户行为的程序。

Solidity是一种针对Ethereum虚拟机(EVM)设计的 花括号语言 。 它受到了C++、Python和JavaScript的影响。你可以在 语言影响 部分找到更多关于Solidity受到哪些语言启发的细节。

Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性。

在部署合约时,应该尽量使用最新版本,因为新版本会有一些重大的新特性以及bug修复(除特殊情况)。

1.2 代码示例

// SPDX-License-Identifier: GPL-3.0
// 使用的solidity 版本
pragma solidity >=0.7.0 <0.9.0;

/// 合约对象
contract Ballot {
    
    // 状态变量 会永久存储在智能合约中
    address public manager;
    

    // 合约的构造函数
    constructor(){
        manager = msg.sender;
    }
    
     // 获取合约余额
    function getBalance() public view returns (uint256){
        return address(this).balance;
    }

  }

2.以太坊虚拟机 EVM

evm在线文档:https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
eth开发者文档: https://ethereum.org/zh/developers/docs/smart-contracts/

EVM 作为一个堆栈机运行,其栈的深度为 1024 个项。 每个项目都是 256 位字,为了便于使用,选择了 256 位加密技术(如 Keccak-256 哈希或 secp256k1 签名)。

在执行期间,EVM 会维护一个瞬态内存(作为字可寻址的字节数组),该内存不会在交易之间持久存在。

然而,合约确实包含一个 Merkle Patricia 存储 trie(作为可字寻址的字数组),该 trie 与帐户和部分全局状态关联。

image.png
image.png

3.存储结构

以太坊虚拟机(Ethereum Virtual Machine,EVM)的存储方式可以分为四种:栈(Stack)、状态存储(Storage)、虚拟机内存(Memory)和只读内存。

3.1 栈

EVM是基于栈的虚拟机,栈中的每一个元素的长度是256位,基本的算数运算和逻辑运算都是使用栈完成。

image.png

3.2 虚拟机内存

虚拟机内存实际上是一个连续的数组空间,用于存放如字符串等较复杂的数据结构。 即数据在内存中,因此数据仅在其生命周期内(函数调用期间)有效
memory/内存

* 内存是一个字节数组,槽大小位256位(32字节)
* 数据仅在函数执行期间存在,执行完毕后就被销毁
* 读或写一个内存槽都会消耗少量的gas 如:3gas
* 为了避免矿工的工作量过大,22个操作之后的单操作成本会上涨

3.3 只读内存

只读内存是EVM最特殊的一种存储结构,主要用于存放参数和返回值。
calldata/调用数据

* 调用数据是不可修改、非持久化的区域,用来保存函数参数,其行为类似于内存
* 外部函数的参数必须使用calldata,但是也可用于其他变量
* 调用数据避免了数据拷贝,并确保数据不被修改
* 函数也可以返回使用calldata声明的数组和结果,但是不可能分配这些类型
image.png

3.4 状态存储

*态存储时key-value的存储结构,用于持久化数据。与栈和虚拟机内存不同,状态存储的值会被记录到以太坊的状态树当中。
storage/存储

* 存储中的数据是永久存在的。存储是一个key/value库- 存储中的数据写入区块链,因此会修改状态,这也是存储使用成本高的原因。
* 占用一个256位的槽需要消耗大量的gas 如:20000 gas
* 修改一个已经使用的存储槽的值,需要消耗大量的gas 如:5000 gas
* 当清零一个存储槽时,会返还一定数量的gas
* 存储按256位的槽位分配,即使没有完全使用一个槽位,也需要支付其开销
image.png

3.5 代码示例

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract StorageTest{

    string public name; //状态变量会默认声明为 storage

    function stackFun() public pure returns(uint256) {
        return 10  * 10;
    }

    function memoryFun(string memory _name) public returns(string memory){
        _name = "test";
        name = _name;
        return name;
    }

    function calldataFun(string calldata _name) public returns(string calldata result){
        //_name = "test";
        name = _name;
        return _name;
    }

}

4.调用方式

在以太坊成功部署的智能合约,可以通过如下的三种方式调用合约中的公共函数(External/Public):

  1. 通过客户端发送消息调用交易(Message Call Transaction),其中包含了数据参数以及目标函数签名的哈希值。

    这种函数调用方式必须在交易得到确认后才能生效。并且,矿工会对该交易收取Gas来作为执行函数时所需要的代价,因此,该方式是一种写操作,即会对消息调用者的账户余额以及合约的状态进行更改

  1. 通过另一个合约来间接的调用。

    这种函数调用方式最终可以被追溯成另一笔消息调用交易。

  1. 通过客户端调用view(或pure)函数。

    这种函数调用方式并不会改变合约的状态,也不需要耗费Gas。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容