本文档根据当前 最新官方版本v0.5.8 进行翻译,本翻译最初 HiBlock 社区发起,后经过 深入浅出区块链社区 社区成员根据最新版本补充翻译。
本中文文档大部分情况下,英中直译,但有时为了更好的理解也会使用意译,如需转载请联系Tiny熊(微信:xlbxiong).
Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在 以太坊虚拟机(EVM) 上运行。
Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性。
在部署合约时,应该尽量使用最新版本,因为新版本会有一些重大的新特性以及bug修复。
警告
Solidity 最近发布了 0.5.x 有很多与之前版本不兼容的升级,理解更新可阅读 更新列表.
语言文档
如果你才接触智能合约概念,推荐从一些 简单的Solidity合约例子 开始,当你想开始尝试了解更多的细节,可以 学习 合约样例 和 深入理解Solidity 。
提示
译者注:理解智能合约及虚拟机是怎么运行,推荐这两篇非常好的文章 完全理解以太坊智能合约 及 深入浅出以太坊虚拟机 。
提示
目前尝试 Solidity 编程的最好的方式是使用 Remix (需要时间加载,请耐心等待)。Remix 是一个基于 Web 浏览器的 IDE,它可以让你编写 Solidity 智能合约,然后部署并运行该智能合约。
警告
因为软件是人编写的,就会有 bug,所以,创建智能合约也应该遵循软件开发领域熟知的最佳实践。这些实践包括代码审查、测试、审计和正确性证明。也请注意,有时候用户在代码方面比软件的作者更谙熟。最后,区块链本身有些东西需要留意,请参考 安全考量。
如果还有问题,你可以尝试搜索或在 Ethereum Stackexchange 上提问,或者到我们的 gitter 频道来。随时欢迎改善 Solidity 或本文档的想法!
翻译版本
本文档由社区志愿者翻译成多种语言,但是 英语版本 作为主要参考。
目录
Solidity 手册
- 入门智能合约
- 安装Solidity编译器
- 根据例子学习Solidity
- 深入理解Solidity
- 注释描述规范
- 安全考量
- 资源
- 使用编译器
- 合约的元数据
- 应用二进制接口Application Binary Interface(ABI) 说明
- Yul
- 编程风格指南
- 通用模式
- 已知bug列表
- 贡献方式
- LLL
- 常见问题
- 基本问题
- 可以在特定的区块上进行操作吗?(比如发布一个合约或执行一笔交易)
- 什么是交易的“有效载荷(payload)”?
- 存在反编译器吗?
- 创建一个可以被中止并退款的合约
- 调用 Solidity 方法可以返回一个数组或字符串(
string
)吗? - 数组可以使用 in-line 的方式(指在声明变量的同一个语句中)来初始化吗?比如:
string[] myarray = ["a", "b"];
- 合约的函数可以返回结构(
struct
)吗? - 我从一个返回的枚举类型(
enum
)中,使用 web3.js 只得到了整数值。我该如何获取具名数值? - 可以使用 in-line 的方式来初始化状态变量吗?
- 结构(
structs
)如何使用? - 循环(
for loops
)如何使用? - 有没有一些简单的操作字符串的例子(
substring
,indexOf
,charAt
等)? - 我能拼接两个字符串吗?
- 为什么大家都选择将合约实例化成一个变量(
ContractB b;
),然后去执行变量的函数(b.doSomething();
),而不是直接调用这个 低级函数low-level function.call()
? - 没被使用的 gas 会被自动退回吗?
- 当返回一个值的时候,比如说
uint
类型的值, 可以返回一个undefined
或者类似 null 的值吗? - 注释会被包含在已部署的合约里吗,而且会增加部署的 gas 吗?
- 如果在调用合约的函数时一起发送了以太币,将会发生什么?
- 合约对合约的交易可以获得交易回执吗?
- 关键字
memory
是什么?是用来做什么的?
- 高级问题
- 怎样才能在合约中获取一个随机数?(实施一份自动回款的博彩合约)
- 从另一份合约中的 non-constant 函数获取返回值
- 让合约在首次被挖出时就开始做些事情
- 怎样才能创建二维数组?
- 当我们复制一个结构(
struct
)时, 结构 (struct
)中定义的映射会被怎么处理? - 我应该如何初始化一份只包含指定数量 wei 的合约?
- 合约的函数可以接收二维数组吗?
bytes32
和string
有什么关系吗?为什么bytes32 somevar = "stringliteral";
可以生效,还有保存下来的那个 32 字节的 16 进制数值有什么含义吗?- 一份合约可以传递一个数组(固定长度)或者一个字符串或者一个
bytes
(不定长度)给另一份合约吗? - 有些时候,当我想用类似这样的表达式:
arrayname.length = 7;
来修改数组长度,却会得到一个编译错误Value must be an lvalue
。这是为什么? - Solidity 的函数可以返回一个字符串数组吗(
string[]
)? - 如果你发起了一次获取数组的调用,有可能获得整个数组吗?还是说另外需要写一个辅助函数来实现?
- 如果某个账户只存储了值但没有任何代码,将会发生什么?例子: http://test.ether.camp/account/5f740b3a43fbb99724ce93a879805f4dc89178b5
- 在定制 通证token 的合约中,下面这些奇怪的校验是做什么的?
- 更多问题?
- 基本问题