当前位置: 首页 > news >正文

solidity的高阶语法(完结篇)

1.样式指南

样式指南有助于保持代码布局一致并使代码更具可读性。 以下是使用 Solidity 编写合约时的最佳实践。

代码布局

  • 缩进 − 使用 4 个空格代替制表符来保持缩进级别。 避免将空格与制表符混合在一起。

  • 两个空行规则 − 在两个合同定义之间使用 2 个空行。

pragma solidity ^0.5.0;contract LedgerBalance {//...
}
contract Updater {//...
}
  • 一个空行规则 − 在两个函数之间使用 1 个空行。 如果只是声明,则不需要空行。

pragma solidity ^0.5.0;contract A {function balance() public pure;function account() public pure;
}
contract B is A {function balance() public pure {// ...}function account() public pure {// ...}
}
  • 最大行长 − 单行不应超过 79 个字符,以便读者可以轻松解析代码。

  • 换行规则 − 第一个参数换行,不带左括号。 每个参数使用单缩进。 终止元素); 应该是最后一个。

function_with_a_long_name(longArgument1,longArgument2,longArgument3
);
variable = function_with_a_long_name(longArgument1,longArgument2,longArgument3
);
event multipleArguments(address sender,address recipient,uint256 publicKey,uint256 amount,bytes32[] options
);
MultipleArguments(sender,recipient,publicKey,amount,options
);
  • 源代码编码 − 优先使用UTF-8或ASCII编码。

  • 导入 − 导入语句应放置在文件顶部紧邻编译指示声明之后。

  • 函数顺序 − 功能应根据其可见性进行分组。

pragma solidity ^0.5.0;contract A {constructor() public {// ...}function() external {// ...}// External functions// ...// External view functions// ...// External pure functions // ...// Public functions// ...// Internal functions// ...// Private functions// ...
}

  • 避免额外的空格 − 避免紧邻圆括号、方括号或大括号内出现空格。

  • 控制结构 − 大括号应与声明在同一行打开。 关闭在自己的行上,保持相同的缩进。 使用带左大括号的空格。

pragma solidity ^0.5.0;contract Coin {struct Bank {address owner;uint balance;}
}
if (x < 3) {x += 1;
} else if (x > 7) {x -= 1;
} else {x = 5;
}
if (x < 3)x += 1;
elsex -= 1;
  • 函数声明 − 对大括号使用上述规则。 始终添加可见性标签。 可见性标签应首先出现在任何自定义修饰符之前。

function kill() public onlyowner {selfdestruct(owner);
}
  • 映射 − 声明映射变量时避免使用空格。

mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
  • 变量声明 − 声明数组变量时避免使用空格。

uint[] x;  // not unit [] x;
  • 字符串声明 − 使用双引号而不是单引号来声明字符串。

str = "foo";
str = "Hamlet says, 'To be or not to be...'";

布局顺序

元素应按以下顺序布局。

  • 编译指示语句

  • 导入语句

  • 接口

  • 合约

在接口、库或合约中,顺序应为 −

  • 类型声明

  • 状态变量

  • 活动

  • 函数

命名约定

  • 合同和库应使用 CapWords 样式命名。 例如,智能合约、所有者等。

  • 合同和库名称应与其文件名匹配。

  • 如果文件中有多个合约/库,请使用核心合约/库的名称。

Owned.sol

pragma solidity ^0.5.0;// Owned.sol
contract Owned {address public owner;constructor() public {owner = msg.sender;}modifier onlyOwner {//....}function transferOwnership(address newOwner) public onlyOwner {//...}
}

Congress.sol

pragma solidity ^0.5.0;// Congress.sol
import "./Owned.sol";contract Congress is Owned, TokenRecipient {//...
}
  • 结构名称

    − 使用像 SmartCoin 这样的 CapWords 风格。

  • 事件名称

    − 使用 CapWords 样式,例如 Deposit、AfterTransfer。

  • 函数名称

    − 使用像initiateSupply 这样的mixedCase 样式。

  • 局部变量和状态变量

    − 使用混合大小写样式,如creatorAddress、supply。

  • 常量

    − 使用所有大写字母和下划线来分隔单词,例如 MAX_BLOCKS。

  • 修饰符名称

    − 使用 mixCase 样式,如 onlyAfter。

  • 枚举名称

    − 使用像 TokenGroup 这样的 CapWords 样式。

2.特殊变量

特殊变量是全局可用的变量,提供有关区块链的信息。 以下是特殊变量列表 −

序号特殊变量和描述
1

blockhash(uint blockNumber) returns (bytes32)

给定区块的哈希值 - 仅适用于 256 个最新区块(不包括当前区块)。

2

block.coinbase (address payable)

当前区块矿工地址。

3

block.difficulty (uint)

当前区块难度。

4

block.gaslimit (uint)

当前区块的 GasLimit。

5

block.number (uint)

当前区块号。

6

block.timestamp

当前区块时间戳,以 UNIX 纪元以来的秒数表示。

7

gasleft() returns (uint256)

Remaining gas.

8

msg.data (bytes calldata)

完整的呼叫数据。

9

msg.sender (address payable)

消息的发送者(当前通话)。

10

msg.sig (bytes4)

调用数据的前四个字节(即函数标识符)

11

msg.value (uint)

与消息一起发送的 wei 数量。

12

now (uint)

当前区块时间戳(block.timestamp 的别名)。

13

tx.gasprice (uint)

交易的 Gas 价格。

14

tx.origin (address payable)

交易的发送者(完整调用链)。

示例

尝试以下代码来查看 msg 的使用,msg 是 Solidity 中用于获取发件人地址的特殊变量。

pragma solidity ^0.5.0;contract LedgerBalance {mapping(address => uint) public balances;function updateBalance(uint newBalance) public {balances[msg.sender] = newBalance;}
}
contract Updater {function updateBalance() public returns (uint) {LedgerBalance ledgerBalance = new LedgerBalance();ledgerBalance.updateBalance(10);return ledgerBalance.balances(address(this));}
}

使用 Solidity First 应用 章节中提供的步骤运行上述程序。

首先单击updateBalance按钮将值设置为10,然后查看日志,其中将显示解码输出为 −

输出

{"0": "uint256: 10"
}

文章转载自:

http://HyzPRjoE.ybgyz.cn
http://U0CfOdxt.ybgyz.cn
http://DWkmKCfr.ybgyz.cn
http://a1blNtIn.ybgyz.cn
http://kstQw2CS.ybgyz.cn
http://kpCh5vsU.ybgyz.cn
http://mzgIA67h.ybgyz.cn
http://Mg4dKH4y.ybgyz.cn
http://xCU9Kueo.ybgyz.cn
http://HR2dGE8e.ybgyz.cn
http://27Ff1zKb.ybgyz.cn
http://lAs9FxMs.ybgyz.cn
http://N13guQKS.ybgyz.cn
http://Y794ZQvE.ybgyz.cn
http://gLchOwZU.ybgyz.cn
http://tSDp2zK6.ybgyz.cn
http://lQTHzhhl.ybgyz.cn
http://6pSboJSq.ybgyz.cn
http://2dDHCS7M.ybgyz.cn
http://IWbK0Guc.ybgyz.cn
http://JXH4CjXo.ybgyz.cn
http://7bQojU1v.ybgyz.cn
http://0kDXCo7j.ybgyz.cn
http://rNVn267y.ybgyz.cn
http://9DWcAhzT.ybgyz.cn
http://LPq9Scu4.ybgyz.cn
http://WYuWK72J.ybgyz.cn
http://98OKRavg.ybgyz.cn
http://ipZdWACO.ybgyz.cn
http://SbreS7s6.ybgyz.cn
http://www.dtcms.com/a/378882.html

相关文章:

  • 端–边–云一体的实时音视频转发:多路RTSP转RTMP推送技术深度剖析
  • OPC Client第10讲:实现主界面;获取初始界面传来的所有配置信息config【C++读写Excel:xlnx;ODBC;缓冲区】
  • git的使用命令
  • uniapp | 实现微信小程序端的分包处理
  • C/C++项目练习:命令行记账本
  • mes之生产管理
  • 【51单片机】【protues仿真】基于51单片机多功能电子秤系统
  • VSCode 下 PlatformIO 的使用
  • Shell编程:生成10个随机数,并判断最大值和最小值
  • nginx参数介绍(Nginx配置文件结构、nginx命令)
  • Java mp4parser 实现视频mp4 切割
  • 安卓13_ROM修改定制化-----系统升级(OTA 更新)后保留 Magisk 的 root 权限和相关功能
  • Codebuddy Code CLI 实战体验:从安装到生成俄罗斯方块小游戏
  • 【代码随想录day 24】 力扣 90. 集合II
  • [iOS] 属性关键字
  • MVC及其衍生
  • 前端开发为什么要禁止使用 == 操作符?
  • langchain4j入门(跟随官网学习)第一章
  • ASSIGN (LV_NAME) TO <FS_NAME>. 通过变量名动态访问变量
  • 二、WPF——Style样式玩法(通过资源字典将Style独立,全局调用)
  • 基于Hadoop进程的分布式计算任务调度与优化实践——深入理解分布式计算引擎的核心机制
  • 用工招聘小程序:功能版块与前端设计解析
  • Golang高效JSON处理:easyjson性能提升6倍
  • Golang语言入门之数组、切片与子切片
  • Go 死锁全解析:4个条件+5个场景+6个解决方案
  • Go语言快速入门教程(JAVA转go)——1 概述
  • 【leetcode】139. 单词拆分
  • 使用yocto工具链交叉编译lsof命令
  • vue项目的main.js规划设计与合理使用
  • FPGA入门-无源蜂鸣器驱动