solidity编程规范

区块链-智能合约Solidity编程 WeBASE(WeBank Blockchain Application Software Extension)是在区块链应用和FISCO-BCOS节点之间搭建的一套通用组件。围绕交易、合约、密钥管理,数据,可视化管理来设计各个模块,开发者可以根据业务所需,选择子系统进行部署。WeBASE屏蔽了区块链底层的复杂度,降低开发者的门槛,大幅提高区块链应用的开发效率,包含节点前置、节点管理、交易链路,数据导出,Web管理平台等子系统。 阅读详情

编程规范

概述

本指南用于提供编写Solidity的编码规范,本指南会随着后续需求不断修改演进,可能会增加新的更合适的规范,旧的不适合的规范会被废弃。

当然,很多项目可能有自己的编码规范,如果存在冲突,请参考项目的编码规范。

本指南的结构及规范建议大都来自于python的pep8编码规范。

本指南不是说必须完全按照指南的要求进行solidity编码,而是提供一个总体的一致性要求,这个和pep8的理念相似(译注:pep8的理念大概是:强制的一致性是非常愚蠢的行为,参见:pep8)。

本指南是为了提供编码风格的一致性,因此一致性这一理念是很重要的,在项目中编码风格的一致性更加重要,而在同一个函数或模块中风格的一致性是最重要的。而最最最重要的是:你要知道什么时候需要保持一致性,什么时候不需要保持一致性,因为有时候本指南不一定适用,你需要根据自己的需要进行权衡。可以参考下边的例子决定哪一种对你来说是最合适的。

代码布局

缩进

每行使用4个空格缩进

tab或空格

空格是首选缩进方式

禁止tab和空格混合使用

回车(空行)

两个合约之间增加两行空行

规范的方式:

contract A {

    ...}

contract B {

    ...}

contract C {

    ...}

不规范的方式:

contract A {

    ...}contract B {

    ...}

contract C {

    ...}

合约内部函数之间需要回车,如果是函数声明和函数实现一起则需要两个回车

规范的方式:

contract A {

    function spam();

    function ham();

}

contract B is A {

    function spam() {

        ...

    }

    function ham() {

        ...

    }

}

不规范的方式:

contract A {

    function spam() {

        ...

    }

    function ham() {

        ...

    }}

源文件编码方式

首选UTF-8或者ASCII编码

引入

一般在代码开始进行引入声明

规范的方式:

import "owned";

contract A {

    ...}

contract B is owned {

    ...}

不规范的方式:

contract A {

    ...}

import "owned";

contract B is owned {

    ...}

表达式中的空格使用方法

以下场景避免使用空格

  • 括号、中括号,花括号之后避免使用空格

Yes规范的方式: spam(ham[1], Coin({name: “ham”}));

No不规范的方式: spam( ham[ 1 ], Coin( { name: “ham” } ) );

  • 逗号和分号之前避免使用空格

Yes规范的方式: function spam(uint i, Coin coin);

No不规范的方式: function spam(uint i , Coin coin) ;

  • 赋值符前后避免多个空格

规范的方式:

x = 1;

y = 2;

long_variable = 3;

不规范的方式:

x             = 1;

y             = 2;

long_variable = 3;

控制结构

合约、库。函数、结构体的花括号使用方法:

  • 左花括号和声明同一行

  • 右括号和左括号声明保持相同缩进位置。

  • 左括号后应回车

规范的方式:

contract Coin {

    struct Bank {

        address owner;

        uint balance;

    }

}

不规范的方式:

contract Coin

{

    struct Bank {

        address owner;

        uint balance;

    }

}

以上建议也同样适用于if、else、while、for。

此外,if、while、for条件语句之间必须空行

规范的方式:

if (...) {

    ...

}

for (...) {

    ...

}

不规范的方式:

if (...)

{

    ...

}

while(...)

{

}

for (...)

 {

    ...;

}

对于控制结构内部如果只有单条语句可以不需要使用括号。

规范的方式:

if (x < 10)

    x += 1;

不规范的方式:

if (x < 10)

    someArray.push(Coin({

        name: 'spam',

        value: 42

    }));

对于if语句如果包含else或者else if语句,则else语句要新起一行。else和else if的内部规范和if相同。

规范的方式:

if (x < 3) {

    x += 1;

}

else {

    x -= 1;

}

if (x < 3)

    x += 1;

else

    x -= 1;

不规范的方式:

if (x < 3) {

    x += 1;} 

else {

    x -= 1;}

函数声明

对于简短函数声明,建议将函数体的左括号和函数名放在同一行。

右括号和函数声明保持相同的缩进。

左括号和函数名之间要增加一个空格。

规范的方式:

function increment(uint x) returns (uint) {

    return x + 1;

}

function increment(uint x) public onlyowner returns (uint) {

    return x + 1;

}

不规范的方式:

function increment(uint x) returns (uint)

{

    return x + 1;

}

function increment(uint x) returns (uint)

{

    return x + 1;

}

function increment(uint x) returns (uint)

 {

    return x + 1;

}

function increment(uint x) returns (uint) 

{

    return x + 1;

}

默认修饰符应该放在其他自定义修饰符之前。

规范的方式:

function kill() public onlyowner {

    selfdestruct(owner);

}

不规范的方式:

function kill() onlyowner public {

    selfdestruct(owner);

}

对于参数较多的函数声明可将所有参数逐行显示,并保持相同的缩进。函数声明的右括号和函数体左括号放在同一行,并和函数声明保持相同的缩进。

规范的方式:

function thisFunctionHasLotsOfArguments(

    address a,

    address b,

    address c,

    address d,

    address e,

    address f,

) {

    do_something;

}

不规范的方式:

function thisFunctionHasLotsOfArguments(address a, address b, address c,

    address d, address e, address f) {

    do_something;

}

function thisFunctionHasLotsOfArguments(address a,

                                        address b,

                                        address c,

                                        address d,

                                        address e,

                                        address f) {

    do_something;

}

function thisFunctionHasLotsOfArguments(

    address a,

    address b,

    address c,

    address d,

    address e,

    address f) {

    do_something;

}

如果函数包括多个修饰符,则需要将修饰符分行并逐行缩进显示。函数体左括号也要分行。

规范的方式:

function thisFunctionNameIsReallyLong(address x, address y, address z)

    public

    onlyowner

    priced

    returns (address)

{

    do_something;

}

function thisFunctionNameIsReallyLong(

    address x,

    address y,

    address z,)

    public

    onlyowner

    priced

    returns (address)

{

    do_something;

}

不规范的方式:

function thisFunctionNameIsReallyLong(address x, address y, address z)

                                      public

                                      onlyowner

                                      priced

                                      returns (address) {

    do_something;

}

function thisFunctionNameIsReallyLong(address x, address y, address z)

    public onlyowner priced returns (address){

    do_something;

}

function thisFunctionNameIsReallyLong(address x, address y, address z)

    public

    onlyowner

    priced

    returns (address) {

    do_something;

}

对于需要参数作为构造函数的派生合约,如果函数声明太长或者难于阅读,建议将其构造函数中涉及基类的构造函数分行独立显示。

规范的方式:

contract A is B, C, D {

    function A(uint param1, uint param2, uint param3, uint param4, uint param5)

        B(param1)

        C(param2, param3)

        D(param4)

    {

        // do something with param5

    }

}

不规范的方式:

contract A is B, C, D {

    function A(uint param1, uint param2, uint param3, uint param4, uint param5)

    B(param1)

    C(param2, param3)

    D(param4)

    {

        // do something with param5

    }

}

contract A is B, C, D {

    function A(uint param1, uint param2, uint param3, uint param4, uint param5)

        B(param1)

        C(param2, param3)

        D(param4) {

        // do something with param5

    }

}

对于函数声明的编程规范主要用于提升可读性,本指南不可能囊括所有编程规范,对于不涉及的地方,程序猿可发挥自己的主观能动性。

映射
待完成

变量声明

对于数组变量声明,类型和数组中括号直接不能有空格。

规范的方式: uint[] x; 不规范的方式: uint [] x;

其他建议

  • 赋值运算符两边要有一个空格

规范的方式:

x = 3;x = 100 / 10;x += 3 + 4;x |= y && z;

不规范的方式:

x=3;x = 100/10;x += 3+4;x |= y&&z;
  • 为了显示优先级,优先级运算符和低优先级运算符之间要有空格,这也是为了提升复杂声明的可读性。对于运算符两侧的空格数目必须保持一致。

规范的方式:

x = 2**3 + 5;x = 2***y + 3*z;x = (a+b) * (a-**b);

不规范的方式:

x = 2** 3 + 5;x = y+z;x +=1;

命名规范

命名规范是强大且广泛使用的,使用不同的命名规范可以传递不同的信息。

以下建议是用来提升代码的可读性,因此被规范不是规则而是用于帮助更好的解释相关代码。

最后,编码风格的一致性是最重要的。

命名方式

为了防止混淆,以下命名用于说明(描述)不同的命名方式。

  • b(单个小写字母)

  • B(单个大写字母)

  • 小写

  • 有下划线的小写

  • 大写

  • 有下划线的大写

  • CapWords规范(首字母大写)

  • 混合方式(与CapitalizedWords的不同在于首字母小写!)

  • 有下划线的首字母大写(译注:对于python来说不建议这种方式)

注意

当使用CapWords规范(首字母大写)的缩略语时,缩略语全部大写,比如HTTPServerError 比HttpServerError就好理解一点。

避免的命名方式

  • l - Lowercase letter el 小写的l

  • O - Uppercase letter oh 大写的o

  • I - Uppercase letter eye 大写的i

永远不要用字符‘l’(小写字母el(就是读音,下同)),‘O’(大写字母oh),或‘I’(大写字母eye)作为单字符的变量名。在某些字体中这些字符不能与数字1和0分辨。试着在使用‘l’时用‘L’代替。

合约及库的命名

合约应该使用CapWords规范命名(首字母大写)。

事件

事件应该使用CapWords规范命名(首字母大写)。

函数命名

函数名使用大小写混合

函数参数命名

当定义一个在自定义结构体上的库函数时,结构体的名称必须具有自解释能力。

局部变量命名

大小写混合

常量命名

常量全部使用大写字母并用下划线分隔。

修饰符命名

功能修饰符使用小写字符并用下划线分隔。

避免冲突

  • 单个下划线结尾

当和内置或者保留名称冲突时建议使用本规范。

通用建议

待完成

转自:
https://github.com/twq0076262/solidity-zh/edit/master/style-guide.md

如果你希望高效的学习以太坊DApp开发,可以访问汇智网提供的最热门在线互动教程:

其他更多内容也可以访问这个以太坊博客。

solidity编码规范 命名规范 文件、合约、库、事件、枚举及结构体命名 当文件里只包含一个合约时,文件命名应该与合约命名相同。 当文件里包含不只一个合约时,文件命名应该根据项目内容合理命名。 合约、库、事件及结构体命名应该使用单词首字母大写的方式,这个方式也称为:驼峰式命名法,比如:SimpleToken, SmartBank, CertificateHashRepository,Player。 函数... 阅读详情

相关推荐

Solidity开发基础

Solidity语言学习必备文档,神一样的文档,没毛病老铁

区块链教程(三):Solidity编程基础

注:本教程为技术教程,不谈论且不涉及炒作任何数字货币 Solidity 入门教学 1、 简介 1.1 Solidity是什么 Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。 Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性。 内含的类型除了常见编程语言中的标准类型,还包括 address等以太坊独有的类型,Solidity 源码文件.

weixin_44023658的博客 7945

solidity编程指南.pdf

solidity编程指南,对语言和工具有详细说明,是基于以太坊开发Dapp的必备参考书。

solidity编程

Solidity源文件布局 Pragma( 版本杂注) 1,源文件可以被版本咋住pragma所注解,表明要求的编译器版本 2,例如;pragma solidity 0.4.0。及所要求版本不能低于0.4.0版本的编译器编译,也不允许高于(包含)0.5.0版本的编译器编译(第二个条件因使用被添加) 3,Import(导入其他源文件)solidity所支持的导入语句import,语法同javascript非常类似。 Import 1,import “filename”; 从filename中导入所有的全局符号

heromps的博客 861

STM32MP157+AD7606BSTZ四通道IEPE传感器采集方案实战(附完整电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器采集方案,涵盖硬件电路设计、软件驱动开发及系统性能优化。通过精确的恒流源设计和同步采样技术,实现高精度振动信号采集,适用于工业振动监测等应用场景。

weixin_42713608的博客 700

nRF24L01模块性能调优笔记:基于STC8H的SPI通信,如何突破700包/秒的传输瓶颈?

本文详细介绍了如何通过SPI通信优化、nRF24L01寄存器配置和STC8H系统级调优,突破700包/秒的传输瓶颈。从硬件设计到软件实现,提供了一套完整的性能调优方案,特别适合需要高性能无线通信的嵌入式开发者。

weixin_42525211的博客 180

Solidity——速通学习

这一讲,我们介绍了什么是函数选择器selector),它和msg.data函数签名的关系,以及如何使用它调用目标函数。在这一讲,我们介绍了如何在Solidity使用try-catch只能用于外部合约调用和合约创建。如果try执行成功,返回变量必须声明,并且与返回的变量类型相同。

qq_46573670的博客 2626

图解转置卷积原理

声明:本文大部分搬运自【机器学习】详解 转置卷积 (Transpose Convolution) 感谢博主花与人间事同,本人只是在博主原创文章上做补充以及添加一些自己的理解。 1 转置卷积的背景 通常,对图像进行多次卷积运算后,特征图的尺寸会不断缩小。而对于某些特定任务 (如图像分割和图像生成等),需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作,称为上采样 (Upsample),如下图所示: 上采样方法有很多,详见【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值

laonafahaodange的博客 5684

solidity 合约权限授权_智能合约编写之Solidity的编程攻略 | 火星号精选

免责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。小编:记得关注哦

weixin_39998273的博客 1020

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)

最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。

weixin_60991529的博客 6241

akamai3简单分析

akamai流程的简单分析

记录一些web逆向的过程 916

Solidity学习 - 短地址攻击

在Solidity智能合约的开发领域,安全始终是重中之重。其中,短地址攻击作为一种较为隐蔽的安全漏洞,犹如一颗隐藏在暗处的“定时炸弹”,随时可能对智能合约的安全性造成严重威胁。接下来,我们将深入剖析短地址攻击的原理,通过实际案例感受其危害,并探讨有效的解决办法。

本郡主是喵 1235

手把手教你玩转RISC-V指令集​​​专栏--​​1.2 对比x86/ARM:RISC-V的三大核心优势(开放、灵活、可扩展)​

​:RISC-V以“开放打破垄断、灵活适配场景、扩展定义未来”的三大优势,正在重塑计算架构格局。其核心价值不仅是技术革新,更是对全球半导体产业链话语权的重新分配。

amy_mhd的博客 130

深入Solidity语言核心语法与类型系统

深入Solidity语言核心语法与类型系统 【免费下载链接】solidity Solidity, the Smart Contract Programming Language 项目地址: https://gitcode.com/...

gitblog_00691的博客 458

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【区块链】以太坊Soliddity编程:智能合约实现之基础

Solidity编程:智能合约实现 solidity的基本语法 solidity的日志、内置变量、函数 solidity的编译测试 简单的代码和案例

小哲的博客 1167

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

智能合约最佳实践 之 Solidity 编码规范

【汇新云】为大家定期更新文章,【汇新云】IT人的产业链平台每一门语言都有其相应的编码规范, Solidity 也一样, 下面官方推荐的规范及我的总结,供大家参考,希望可以帮助大家写出更好规范的智能合约。命名规范避免使用小写的l,大写的I,大写的O 应该避免在命名中单独出现,因为很容易产生混淆。合约、库、事件、枚举及结构体命名合约、库、事件及结构体命名应该使用单词首字母大写的方式,这个方式也称为:帕...

qq_39353009的博客 515

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Solidity 使用及注意事项

1、规范 (1)习惯上函数中的参数变量是以_(下划线)开头,以区别全局变量;私有函数名字也用_(下划线)开头。 pragma solidity ^0.6.0; contract Student { string name; //私有函数名_create 与参数变量_name,都以_开头 function _create(string _name) private { name = _name; } } 2、变量、变量类型、变量修饰符 (1)状态变量

ling1998的博客 3722

Solidity 编码规范

本文目的是约定 solidity 代码的编码规范,保持代码的 一致性,方便阅读和理解。下面是官方推荐及总结的规范和风格。另外本人也在找【合约开发】方面的工作,有公司内推的朋友可以和我说说哈首选 UTF-8 或 ASCII 编码。 - 每个缩进级别使用4个空格。 -空格是首选的缩进方法。 -应该避免混合使用制表符和空格。 在 solidity 源码中合约声明之间留出两个空行。正确写法: 错误写法: 在一个合约中的函数声明之间留有一个空行。在相关联

qq_28053637的博客 1478

智能合约编写之Solidity的编程攻略|FISCO BCOS超话区块链专场(篇5)

前 言 作为一名搬砖多年的资深码农,刚开始接触Solidity便感觉无从下手:昂贵的计算和存储资源、简陋的语法特性、令人抓狂的debug体验、近乎贫瘠的类库支持、一言不合就插入汇编语句……让人不禁怀疑,这都已经过了9012年了,居然还有这种反人类的语言? 对于习惯使用各类日益“傻瓜化”的类库和自动化高级框架的码农而言,学习Solidity的过程就是一场一言难尽的劝退之旅。...

FISCO_BCOS的博客 3399

Solidity基础八

Solidity编程风格、Solidity合约编写过程、Solidity合约结构、Solidity常见编程错误、Solidity调用合约、Solidity自毁合约、Solidity哈希算法、Solidity权限控制合约、Solidity验证签名、ABI和bytecode和EVM、Solidity内置对象

尽欢的博客 2660
上一篇: solidity常见问题
下一篇: solidity源文件布局
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值