以太坊智能合约学习笔记(一)
前言
以太坊的目标是打造一个用于运行智能合约的去中心化平台,根据程序代码的设置来运行应用,目的是保障程序运行时不存在审查、欺诈、停机、以及第三方人为干预的可能。开发者可以使用官方提供的工具在其上开发、部署并运行智能合约。
一些名词解释
1.图灵完备
图灵完备来自计算机的概念,指程序代码语言加上能在图灵机上运行的运算规则,符合这种要去的逻辑系统、装置、或者编程语言就可以被认为是图灵完备的。图灵完备的语言有循环执行语句、判断分支语句等,理论上能解决任何算法。那么它的一个显著特点就是支持程序循环不断地运行下去。缺点就是其有可能进入死循环而导致程序崩溃。
2.智能合约
智能合约概念于1995年由Nick Szabo首次提出,是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约的目的是为了提供一种优于传统合约条款执行的安全方法,减少合约相关的交易成本
智能合约以数字形式执行,意味着合约必须以计算机可读的代码形式来呈现,只要参与方达成协议,智能合约简历的权利和义务会由一台计算机或者是一个计算机网络来执行。
合约的作用
(1)维护存储的数据。
(2)为具有复杂访问规则的EOA账户服务
(3)管理执行中的合约
(4)给其它合约提供函数。
3.智能合约与DApp的关系与区别
DApp(Decentralized App),即去中心化的应用程序,是一种基于智能合约的应用,其目的是让智能合约有一个友好的界面,并扩展一些额外的功能,如分布式存储等。与传统的网站不同,DApp不能在普通的服务器上运行,而是运行在一台以太坊交互节点或一台与以太坊节点交互的中心化服务器上,需要将交易提交到区块链并且从区块链中读取重要的数据。用户在区块链网络上被表示成一个“钱包”地址,其它用户数据则保存在本地,这点与传统的用户登录系统不同。
一个完整的DApp流程如下:
1)用Solidity(或其他语言)编写智能合约(后缀为.sol)。
2)用sole编译器将.sol合约编译成EVM字节码。
3)编译好的字节码回送给DApp前端。
4)前端将编译好的智能合约部署到区块链中。
5)区块链返回智能合约地址+ABI(即合约接口)。
6)前端通过Address+ABI+nonce,调用智能合约。
7)智能合约开始处理。
4.智能合约开发语言solidity
Solidity 语言是一种专门用于编写和执行智能合约的语言,是在以太坊虚拟机基础上运行的、面向合约的高级语言,最初是在 2014 年 8 月由以太坊的前任 CTO和联合创始人 Gavin Wood 提出来的,后来由以太坊开发人员组建了一支专门的团队,对 Solidity 语言进行不断改进,目前仍在开发和优化之中,在 GitHub 上的开发存储区域是htps:/github.com/thereum/solidity,在这里我们可以了解到最全面的关于 Solidity 语言开发和迭代的过程详情、相关文档。
在语言的风格上,Solidity 语言受到 C++、Python 和 JavaScript 3 种语言的深刻影响,它是一种静态类型的编程语言,以字节码(Bytecode)的模式进行编译,因此可以在以太坊虚拟机上运行。Gavin Wood 在开发 Solidity 语言时借鉴了 JavaScript 的 ECMAScript 脚本语言的语法规则,使它与现有的网页开发语言有些类似,但其实有较大不同,如 Solidity 语言拥有静态类型、可变返回函数等。最重要的一点是,Solidity 语言可以编写具有自执行的业务逻辑、嵌入智能合约中的合约,因此它不但是以太坊的基础编程语言之一,而且是其他绝大部分基于以太坊的、具有智能合约的各种区块链产品(Blockchain 2.0)的基础编程语言,被广泛应用于目前绝大多数区块链产品,如超级账本(Hyperledger)项目就是用 Soliditv 语言开发而成的。
简单的智能合约代码
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.8.0<