当前位置: 首页 > 编程日记 > 正文

一个Solidity源文件的布局

链客,专为开发者而生,有问必答!

此文章来自链客区块链技术问答社区,未经允许拒绝转载。

在这里插入图片描述

源文件可以包含任意数量的合约定义,include指令和pragma伪指令。

Pragma 版本

源文件可以(并且应该)使用所谓的版本编译指示进行注释,以拒绝随后可能引入不兼容更改的编译器版本进行编译。我们尝试将这些更改保持在绝对最小值,尤其是在语义变化也需要更改语法的情况下引入更改,但这并不总是可能的。因此,至少对于包含突破性更改的版本,读取更改日志总是一个好主意,这些版本将始终具有0.x.0或x.0.0格式的版本。

版本pragma使用如下:

pragma solidity ^0.4.0;

这样一个源文件不会使用比版本0.4.0之前的编译器编译,并且它也不会在从0.5.0版本开始的编译器(第二个条件通过使用^添加)起作用。 这个想法是,直到版本0.5.0才会有变化,所以我们可以随时确定我们的代码将按照我们打算的方式进行编译。 我们不会修复编译器的确切版本,因此修补程序版本仍然可能。

可以为编译器版本指定更复杂的规则,表达式遵循由npm使用的规则。

导入其他源文件

语法和语义

Solidity支持与JavaScript中可用的导入语句(来自ES6)的引用语句,尽管Solidity不知道“default export”的概念。

在全局层面,您可以使用以下形式的导入语句:

import “filename”;

此语句从“filename”(以及导入的符号)导入所有全局符号到当前全局范围(与ES6不同,但与Solidity相反)。

import * as symbolName from “filename”;

…创建一个新的全局符号symbolName,其成员都是来自“filename”的全局符号。

import {symbol1 as alias, symbol2} from “filename”;

…创建新的全局符号alias和symbol2,分别从“filename”引用symbol1和symbol2。

另一种语法不是ES6的一部分,但可能很便于:

import “filename” as symbolName;

相当于import * as symbolName from “filename”;

路径

在上文中,文件名始终被视为具有/作为目录分隔符的路径. .作为当前目录和…作为父目录。 当. 或…后跟一个字符,除了/,它不被认为是当前或父目录。 所有路径名称都被视为绝对路径,除非它们以当前的路径开头. 或父目录…

要从与当前文件相同的目录导入文件x,请使用导入“./x”作为x ;. 如果使用导入“x”作为x; 相反,可以引用不同的文件(在全局“包含目录”中)。

这取决于编译器(见下文)如何实际解析路径。一般来说,目录层次结构不需要严格地映射到本地文件系统上,它也可以映射到通过例如文件发现的资源比如ipfs,http或git。

在实际编译器中使用

当调用编译器时,不仅可以指定如何发现路径的第一个元素,而且可以指定路径前缀重新映射,github.com/ethereum/dapp-bin/library被重新映射到/usr/local/dapp-bin/library,编译器将从那里读取文件。 如果可以应用多重重新映射,则首先尝试使用最长密钥。 这允许一个“回退-重新映射”与例如 “”映射到“/usr/local/ include/solidity”。 此外,这些重新映射可以依赖于上下文,它允许您配置包导入例如 不同版本的同名库。

solc:

对于solc(命令行编译器),这些重新映射作为上下文提供:prefix = target参数,其中context和and = target部分都是可选的(在这种情况下,target默认为前缀)。 所有重新映射的值都是常规文件(包括它们的依赖项)。 这个机制是完全向后兼容的(只要没有文件名包含=或:),因此不会发生变化。 导入以前缀开头的文件的目录上下文文件中的所有导入将通过将目标替换为前缀来重定向。

例如,如果您将本地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的模块。 在/usr/local/ dapp-bin_old中检出旧版本的dapp-bin,然后可以使用

solc module1:github.com/ethereum/dapp-bin/=/usr/local/dapp-bin/ \ module2:github.com/ethereum/dapp-bin/=/usr/local/dapp-bin_old/ \ source.sol

所以module2中的所有导入都指向旧版本,但是在module1中导入获取新版本。

请注意,solc仅允许您包含某些目录中的文件:它们必须位于显式指定的源文件之一或重映射目标的目录(或子目录)中的目录(或子目录)中。 如果要允许直接绝对包含,只需添加重新映射=/。

如果存在导致有效文件的多个重新映射,则选择具有最长公共前缀的重映射。

Remix:

Remix为github提供自动重新映射,并且还可以通过网络自动检索文件:您可以通过例如导入迭代映射。

import “github.com/ethereum/dapp-bin/library/iterable_mapping.sol” as it_mapping;

其他源代码提供者可能会在将来被添加。

注释

单行注释(//)和多行注释(//)是可行的。

// 单行注释./多行注释/

另外还有另一种类型的评论叫做natspec注释,文档还没有被写入。 它们是用三斜杠(///)或双星号块(/ * … /)编写的,它们应该直接在函数声明或语句上方使用。 您可以在这些注释中使用Doxygen风格的标签来记录功能,注释条件以进行正式验证,并提供确认文本,当用户尝试调用功能时,该文本将显示给用户。

在下面的例子中,我们记录了合同的标题,两个输入参数的说明和两个返回的值。

pragma solidity ^0.4.0;/** @title Shape calculator. /contract shapeCalculator { /* @dev Calculates a rectangle’s surface and perimeter. * @param w Width of the rectangle. * @param h Height of the rectangle. * @return s The calculated surface. * @return p The calculated perimeter. */ function rectangle(uint w, uint h) returns (uint s, uint p) { s = w * h; p = 2 * (w + h); }}

相关文章:

iOS 数字滚动 类似于老 - 虎- 机的效果

效果图 具体实现代码如下 ZCWScrollNumView.h文件 #import <UIKit/UIKit.h>typedef enum {ZCWScrollNumAnimationTypeNone,ZCWScrollNumAnimationTypeNormal,ZCWScrollNumAnimationTypeFromLast,ZCWScrollNumAnimationTypeRand,ZCWScrollNumAnimationTypeFast } ZCWScro…

序列化模块--json模块--pickle模块-shelve模块

什么叫序列化&#xff1f; 序列化是指把内存里的数据类型转变成字符串&#xff0c;以使其能存储到硬盘或通过网络传播到远程&#xff0c;因为硬盘或网络传输时只能接受bytes 例&#xff1a; 把内存数据 转成字符 # data {# roles:[# {role:monster,type:pip,life:5…

UITextView添加占位字符

#import "YGTextView.h"#define kPlaceholderDefaultTopMargin 4 // Placeholder上下间距#define kPlaceholderDefaultLeftMargin 5 // Placeholder左右间距implementation YGTextView#pragma mark - 初始化PlaceholderTextView- (instancetype)initWithFrame…

手把手教你搭建智能合约测试环境、开发、编译、部署以及如何通过JS调用合约方法

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 学习目标 了解智能合约 简单环境搭建 能够利用solidity编写Hello World合约 合约部署 和合约互动 使用solidity语言撰写智能合约 …

洛谷P3159 [CQOI2012]交换棋子

巧妙的拆点方式&#xff0c;首先把1看成黑点&#xff0c;0看成空的&#xff0c;几次交换就可以看成一条路径 1&#xff09;从容量上看&#xff0c;这条路径为1-2-2-2-2-2-……-2-1 2&#xff09;从费用上看&#xff0c;这条路径每条边费用都是1 于是用一种巧妙的拆点方式&#…

趣谈iOS运行时的方法调用原理

一个成熟的计算机语言必然有丰富的体系&#xff0c;复杂的容错机制&#xff0c;处理逻辑以及判断逻辑。但这些复杂的逻辑都是围绕一个主线丰富和展开的&#xff0c;所以在学习计算机语言的时候&#xff0c;先掌握核心&#xff0c;然后了解其原理&#xff0c;明白程序语言设计的…

GCD实现倒计时

__block int timeout59; //倒计时时间dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_source_t _timer dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);dispatch_source_set_timer(_timer,dispatch_wall…

Solidity基础入门知识(十)函数的访问权限和可见性

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式&#xff0c;以及Solidity提供的对函数调用时的…

Sass (Syntactically Awesome StyleSheets)

Sass (Syntactically Awesome StyleSheets) Sass 是对 CSS 的扩展&#xff0c;让 CSS 语言更强大、优雅。 它允许你使用变量、嵌套规则、 mixins、导入等众多功能&#xff0c; 并且完全兼容 CSS 语法。 Sass 有助于保持大型样式表结构良好&#xff0c; 同时也让你能够快速开始小…

键盘的相关设置

一、键盘风格 UIKit框架支持8种风格键盘。 typedef enum { UIKeyboardTypeDefault, // 默认键盘&#xff1a;支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默认键盘 UIKeyboardTypeNumbersAndPunctuation, // 标准电…

python全栈开发基础【第十七篇】面向对象反射和内置方法

一、静态方法&#xff08;staticmethod&#xff09;和类方法&#xff08;classmethod&#xff09; 类方法&#xff1a;有个默认参数cls,并且可以直接用类名去调用&#xff0c;可以与类属性交互&#xff08;也就是可以使用类属性&#xff09; 静态方法&#xff1a;让类里的方法直…

区块链笔记分享

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链笔记分享:技术和数学基础: 高位的hash的逆向过程除了穷举&#xff0c;没有更有效的办法&#xff0c;这个过程在目前的计算能力下必然…

BZOJ4766: 文艺计算姬

Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 737 Solved: 402[Submit][Status][Discuss]Description "奋战三星期&#xff0c;造台计算机"。小W响应号召&#xff0c;花了三星期造了台文艺计算姬。文艺计算姬比普通计算机有更多的艺术细胞。普通计算机能计算一个…

Android调用远程Service的参数和返回值都需要实现Parcelable接口

import android.os.Parcel;import android.os.Parcelable; public class Person implements Parcelable{   private Integer id;   private String name;   private String pass;   public Person() {     super();   } public Person(Integer id, String name, …

git的简单命令

git init 初始化管理库 git add file_name 将文件添加到文件管理库 git commit -m “xxx” 将文件提交到文件管理库&#xff08;xxx&#xff1a;说明文字&#xff09; git status 查看当前状态 git diff 查看文件改动的地方 git log 查看历史版本提交记录(如果觉…

区块链概念:Hash 算法

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链概念1&#xff1a;Hash 算法 作用在学习哈希算法前&#xff0c;我们需要知道哈希在区块链的作用哈希算法的作用如下&#xff1a;区块…

java 文件操作

文件操作——File File表示目录信息 listFiles方法 File的listFiles方法用于返回一个抽象路径名数组&#xff0c;这些路径名表示此抽象路径名表示的目录中的文件。其方法定义: File[] listFiles()返回值&#xff1a;抽象路径名数组&#xff0c;这些路径名表示此抽象路径名表示的…

三维等值面提取算法(Dual Contouring)

上一篇介绍了Marching Cubes算法&#xff0c;Marching Cubes算法是三维重建算法中的经典算法&#xff0c;算法主要思想是检测与等值面相交的体素单元并计算交点的坐标&#xff0c;然后对不同的相交情况利用查找表在体素单元内构建相应的网格拓扑关系。Marching Cubes算法简单&a…

设置status bar的颜色

statusBar显示电池电量、时间、网络部分标示的颜色只能设置两种颜色&#xff1a; 默认的黑色&#xff08;UIStatusBarStyleDefault&#xff09;白色&#xff08;UIStatusBarStyleLightContent&#xff09; 配置info.plist文件 1.View controller-based status bar appearance…

EOS与以太坊有哪些区别?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 以太坊是一个专门为开发和运行去中心化应用&#xff08;DAPP&#xff09;搭建的智能合约平台&#xff1b;EOS与以太坊类似&#xff0c;同样…

Quartz 2D基本图形的绘制

基本步骤&#xff1a; 1.获取绘图上下文 2.创建并设置路径 3.将路径添加到上下文 4.设置上下文状态 5.绘制路径 6.释放路径 #import "YGView.h" //屏幕尺寸#define kScreenSize [UIScreen mainScreen].bounds.size//屏幕宽高定义#define kscreenWidth [[UIScr…

命令行程序增加 GUI 外壳

Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过&#xff1a; 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳&#xff0c;实际效果参考图 2. 图 2 带 GUI 外壳的命令行程序 程序思路是这样的&#xff1a; 通过运行 cmd.exe 来操作命令行&#xff0c…

人月神话阅读笔记07

第1章 焦油坑焦油坑的意思说明了即使你足够强大&#xff0c;也无法摆脱束搏而沉到坑底。IT项目也是这样&#xff0c;不论是开发大型软件系统还是小型项目&#xff0c;都会遇到诸多复杂的问题和影响因素&#xff0c;项目本身就是一个足够复杂的动态系统&#xff0c;没有最优&…

区块链隐私:交易还是计算?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链隐私&#xff1a;交易还是计算&#xff1f; 隐私”是什么意思?在区块链生态系统中&#xff0c;“隐私”这个词被用于许多不同的语…

8 ServletContext

1 为什么需要ServletContext 技术 显示网站多少人在线&#xff0c;显示当前登录者是第几位登录者等信息。 2 什么是ServletContext 可以把它想象成一个服务器上的公共空间&#xff0c;每个用户都可以访问到它。 Web 容器在启动时&#xff0c;它会为每个Web 应用程序都创建一个对…

IOS沙盒Files目录说明和常用操作

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 读取Documents目录代码 NSArray *pathsDocumentsNSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *pathDocu…

iOS一些实用的技巧

获取触摸的点- (CGPoint)locationInView:(UIView *)view; - (CGPoint)previousLocationInView:(UIView *)view;自动适应父视图大小self.view.autoresizesSubviews YES;self.view.autoresizingMask UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;把pli…

在公共区块链中通过加密保护数据

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 隐私限制 在处理或交换业务文件时&#xff0c;贸易伙伴可能需要某些隐私因素。 (1)交易数据的隐私性: 交易数据仅供交易双方阅读。 (2)交…

python xml模块学习

xml打开方式 # xml有两种打开方式 # 1. 打开文件&#xff0c;读取XML内容 str_xml open(xman.xml, r).read() print(str_xml)# 将字符串解析成xml特殊对象&#xff0c;root代指xml文件的根节点 root ET.XML(str_xml) # 读取字符串&#xff0c;将字符串转为Element对象 pri…

实例 - 购物车 (列表、循环)

salary int(input(Please input your money:))product [(iphone6s,5800),(mac bood,9000),(coffee,32),(python book,80),(bicyle,1500), ]shopping []while True:#打印商品内容n 1for i,v in product:print(n,.,i,v)n 1#引导用户选择商品choice input(选择购买商品编号:…