开发工具:
文件大小: 751kb
下载次数: 0
上传时间: 2019-09-07
详细说明:solidity智能合约编写教程 文档总结 便于查看 有目录库的调用保拧.…
46
Using For.…….……
47
Ms
Msq. sender.…,…,…,…,…,…,…,…,…,…,…,…,…,…,,
53
nterna和 external..53
Solidity源文件结构
源文件中可以包含任意多个合约定义、导入指令和杂注指令。
版本杂注
为了避免未来被可能引入不兼容变更的编译器所编译,源文件可以(也应该)被所谓的版本
所注解。我们力图把这类变更做到尽可能小,特别是,我们需要以一种当修改语义时必须
同步修改语法的方式引入变更,当然这有时侯也难以做到。因此,至少对含重大变更的版
本,通读变更日志永远是好办法。这些版本的版本号始终是0x。0或者x00的形式。
版本杂注使用如下:
pragma solidity 0.4.0
这样,源文件将既不允许低于0.4.0版本的编译器编译,也不允许高于(包含)0.5.0版本
的编译器编译(第二个条件因使用^被添加)。这种做法的考虑是,编译器在0.5.0版本之
前不会有重大变更,所以可确保源代码始终按预期被编译。上面例子中不固定编译器的具
体版本号,因此编译器的补丁版也可以使用。
可以使用更复杂的规则来指定编译器的版本,表达式遵循npm版本语义。
注解
Pragma是 pragmatic information的简称,微软suaC+文档中译为杂注。 Solidity中沿
用C;C++等中的编译指令概念,用于告知编译器如何编译。一-译者注
导入其他源文件
语法与语义
虽然 Solidity不知道" default export"为何物,但是 Solidity所支持的导入语句,其语法同
Javascript(从ES6起)非常类似。
注解
ES6即 ECMAScript6.0,ES6是 JavaScript语言的下一代标准,已经在2015年6月正式发
布
译者注
在全局层面上,可使用如下格式的导入语句:
import"filename,
此语句将从“ filename"中导入所有的全局符号到当前全局作用域中(不同于ES6, Solidity
是向后兼容的)。
import" as symbolName from"filename
创建一个新的全局符号 symbolName,其成员均来自 filename"中全局符号。
import (symbol as alias, symbol) from"filename";
创建新的全局符号aas和 symbol,分别从" Filename"引用 symbol和 symbol
另一种语法不属于ES6,但或许更简便:
import filenames symbolName;
这条语句等同于 import* as symbolName from" filename";
路径
上文中的 filename总是会按路径来处理,以/作为目录分割符、以标示当前目录、以表
示父目录。当或.后面跟随的字符是/时,它们才能被当做当前目录或父目录。只有路径
以当前目录或父目录开头时,才能被视为相对路径。
用 Import"/"asx;语句导入当前源文件同目录下的文件x。如果用 Import"x"asx;代替,可能
会引入不同的文件(在全局 include directory中)。
最终导入哪个文件取决于编译器(见下文)到底是怎样解析路径的。通常,目录层次不必
严格映射到本地文件系统,它也可以映射到能通过诸如ipfs,htp或者git发现的资源。
在实际的编译器中使用
当运行编译器时,它不仅能指定如何发现路径的第一个元素,还可指定路径前缀。例如,
github. com/ etherium/ dapp-bin/ibay会被重映射到/ Isr/local/ dapp-bin/ library,此时编译器将从重
映射位置读取文件。如果重映射到多个路径,优先尝试重映射路径最长的一个。这允许将
比如被映射到"/ sr/local/include/ solidity"来进行“回退重映射。同时,这些重映射可取决于
上下文,允许你配置要导入的包,比如同一个库的不同版本
Solc
对于so(命令行编译器),这些重映射以 context: prefix- target形式的参数提供。其中,
context:和 -target部分是可选的(此时 target默认为prex)。所有重映射的值都是被编译
过的常规文件(包括他们的依赖),这个机制完全是向后兼容的(只要文件名不包含=或
),因此这不是一个破坏性修改。在 content目录或其子目录中的源码文件中,所有导入语
句里以pex开头的导入文件都将被用 target替换prefⅸ来重定向。
举个例子,如果你已克隆 github. com/ethereum/dapp-bin到本地/ usr/local/dapp-bin,可在源文件
中使用
import"github. com/ethereum/dapp-bin/library/iterable_mapping. sol"as it_mapping
然后运行编译器:
solc github. com/ethereum/dapp-bin/=/usr/local/ dapp-bin/ source. sol
举个更复杂的例子,假设你依赖了一些使用了非常旧版本的dapp-bin的模块。旧版本的
dapp-bin已经被 checkout到/ usr/local/dapp-bin_old,此时你可使用:
solc modulel: github. com/ethereum/dapp-bin/=/usr/local/dapp-bin/I
nodule2: github. com/ethereum/dapp-bin/=/usr/local/dapp-bin_old/
source. so
这样, module2中的所有导入都指向旧版本,而 module中的导入则获取新版本。
注意,sol只允许包含来自特定目录的文件:它们必须位于显式地指定的源文件目录(或
子目录)中,或者重映射的目标目录(或子目录)中。如果你想直接用绝对路径来包含文
件,只需添加重映射=
如果有多个重映射指向一个有效文件,那么具有最长公共前缀的重映射会被选用。
Remix.
Remⅸ提供一个为 github源代码平台的自动重映射,它将通过网络自动获取文件:比如,
你可以使用import"github.com/ethereum/dapp-bin/library/iterable_mapping.sol"asit_mapping;导入一个
map迭代器。
未来,Remⅸ可能支持其他源代码平台。
注释
可以使用单行注释()和多行注释(∵
∥这是一个单行注释。
这是一个
多行注释。
此外,有另一种注释称为 natspec注释,其文档还尚未编写。它们是用三个反斜杠()或
双星号开头的块(*…*)书写,它们应该直接在函数声明或语句上使用。可在注释中使
用 Doxygen样式的标签来文档化函数、标注形式校验通过的条件,和提供一个当用户试图
调用一个函数时显示给用户的确认文本。
在下面的例子中,我们记录了合约的标题、两个入参和两个返回值的说明:
pragma solidity 0.4.0;
/*ttle形状计算器。*
contract shape Calculator I
/**dev求矩形表明面积与周长。
param w矩形宽度。
param h矩形高度。
return s求得表面积。
return p求得周长。
function rectangle(uint W, uint h)returns (uint s, uint p)
2
h)
Next previous
合约结构
在 Solidity中,合约类似于面向对象编程语言中的类。每个合约中可以包含状态变量、函
数、函数修饰器、事件、结构类型、和枚举类型的声明,且合约可以从其他合约继承。
状态变量
状态变量是永久地存储在合约存储中的值。
pragma solidity 0.4.0
contract Simple Storage t
uint stored Data;∥状态变量
有效的状态变量类型参阅类型章节,对状态变量可见性有可能的选择参阅可见性和 getter
函数
函数
函数是合约中代码的可执行单元。
pragma solidity 0.4.0;
contract SimpleAuction
ction bid( public payable{∥函数
函数调用可发生在合约内部或外部,且函数对其他合约有不同程度的可见性(可见性和
tter函数)
函数修饰器
函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中函数)。
pragma solidity A0 4.22:
contract Purchase i
address public seller
modifier onlySeller(){∥修饰器
quire
Isg sender ==sell
call th
;
function abort() public only Seller [//Modifier usage
事件
事件是能方便地调用以太坊虚拟机日志功能的接口。
pragma solidity 0. 4.21;
contract SimpleAuction f
event HighestBidIncreased( address bidder, uint amount);∥事件
function bid() public payable i
emit HighestBidIncreased(msg. sender, msg. value);∥)舯发事件
有关如何声明事件和如何在dapp中使用事件的信息,参阅合约章节中的事件。
结构类型
结构是可以将几个变量分组的自定义类型(参阅类型章节中的结构体)。
pragma solidity 0.4.0
contract Ballot f
struct voter{∥结构
uint weight,
bool voted
address delegate
uint vote
枚举类型
枚举可用来创建由一定数量的“常量值"构成的自定义类型(参阅类型章节中的枚举类型)。
pragma solidity 0.4.0
contract Purchase i
enum state[ Created, Locked, Inactive]∥枚举
值类型
以下类型也称为值类型,因为这些类型的变量将始终按值来传递。也就是说,当这些变量
被用作函数参数或者用在赋值语句中时,总会进行值拷贝。
布尔类型
boo:可能的取值为字面常数值true和 false
运算符:
!(逻辑非
8&(逻辑与,"and")
(逻辑或,"or")
=(等于)
·!=(不等于)
运算符‖和&&都遵循同样的短路( short-circuiting)规则。就是说在表达式f)‖gy中,
如果f(x)的值为tue,那么g就不会被执行,即使会出现一些副作用。
整型
nt/uint:分别表示有符号和无符号的不同位数的整型变量。支持关键字uint到uint256(无
符号,从8位到256位)以及i8到int256,以8位为步长递增。uint和int分别是unt256
和int256的别名。
运算符
比较运算符:≤,<,=,=,>,>(返回布尔值)
位运算符:&,|,^(异或),(位取反)
算数运算符:*,-,一元运算,一元运算+,",/,%(取余),“(幂),
(左移位),>(右移位)
除法总是会截断的(仅被编译为EVM中的υw操作码),但如果操作数都是字面常数
( literals)(或者字面常数表达式),则不会截断。
除以零或者模零运算都会引发运行时异常。
移位运算的结果取决于运算符左边的类型。表达式xy
与x/2*’y是等价的。这意味对一个负数进行移位会导致其符号消失。按负数位移动会引发
运行时异常。
警告
由有符号整数类型负值右移所产生的结果跟其它语言中所产生的结果是不同的。在 Solidity
中,右移和除是等价的,因此对一个负数进行右移操作会导致向0的取整(截断)。而在
其它语言中,对负数进行右移类似于(向负无穷)取整。
定长浮点型
警告
Solidity还没有完全支持定长浮点型。可以声明定长浮点型的变量,但不能给它们赋值或把
它们赋值给其他变量。。
fed/ufed:表示各种大小的有符号和无符号的定长浮点型。在关键字 fixed MxN和 fixedMxN
中,M表示该类型占用的位数,N表示可用的小数位数。M必须能整除8,即8到256位。
N则可以是从0到80之间的任意数。 fixed和fed分别是 fixed128×19和fied128×19的别名。
运算符
比较运算符:≤,≤,=,=,=,>(返回值是布尔型)
算术运算符:+,,一元运算,一元运算+,“,,%(取余数)
注解
浮点型(在许多语言中的foat和 double类型,更准确地说是lEE754类型)和定长浮点型
之间最大的不同点是,在前者中整数部分和小数部分(小数点后的部分)需要的位数是灵
活可变的,而后者中这两部分的长度受到严格的规定。一般来说,在浮点型中,几乎整个
空间都用来表示数字,但只有少数的位来表示小数点的位置。
地址类型
address:地址类型存储一个20字节的值(以太坊地址的大小)。地址类型也有成员变量,
并作为所有合约的基础。
运算符:
=,,=,,>和>
注解
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.