Solidity文档翻译系列
文章平均质量分 76
黄嘉成
这个作者很懒,什么都没留下…
展开
-
【Solidity】可用于(内联)装配的语言:Joyfully Universal Language
Joyfully Universal LanguageJULIA是一种中间语言,可以编译到各种不同的后台(EVM 1、EVM 1.5和EWASM)。它已经可以用于Solidity内部的“内联汇编”,未来版本的Solidity编译器甚至会使用JULIA作为中间语言。对于JULIA来说构建高级优化器阶段也很容易。 注解 请注意,用于“内联汇编”的风格没有类型(所有都是U256...翻译 2018-06-01 13:02:10 · 540 阅读 · 0 评论 -
深入理解Solidity——Solidity汇编
Solidity汇编(Solidity Assembly)Solidity定义了一个汇编语言,可以不同Solidity一起使用。这个汇编语言还可以嵌入到Solidity源码中,以内联汇编的方式使用。下面我们将从内联汇编如何使用着手,介绍其与独立使用的汇编语言的不同,最后再介绍这门汇编语言。内联汇编(Inline Assembly)通常我们通过库代码,来增强语言我,实现一些精细化的控制,...翻译 2018-05-23 10:26:14 · 2962 阅读 · 0 评论 -
深入理解Solidity——Using for
指令using A for B;用来附着库里定义的函数(从库A)到任意类型B。这些函数将会默认接收调用函数对象的实例作为第一个参数。语法类似,python中的self变量一样。using A for *的效果是,库A中的函数被附着在做任意的类型上。在这两种情形中,所有函数,即使那些第一个参数的类型与调用函数的对象类型不匹配的,也被附着上了。类型检查是在函数被真正调用时,函数重载检查也会执行...翻译 2018-05-22 23:51:21 · 2965 阅读 · 0 评论 -
深入理解Solidity——库
库(Libraries)库与合约类似,但它的目的是在一个指定的地址,且仅部署一次,然后通过EVM的特性DELEGATECALL(Homestead之前是用CALLCODE)来复用代码。这意味着库函数调用时,它的代码是在调用合约的上下文中执行。使用this将会指向到调用合约,而且可以访问调用合约的storage。因为一个合约是一个独立的代码块,它仅可以访问调用合约明确提供的状态变量,否则除此之外...翻译 2018-05-22 23:46:06 · 1651 阅读 · 0 评论 -
深入理解Solidity——抽象合约和接口
抽象合约(Abstract Contracts)合约函数可以缺少实现(请注意,函数声明头被;终止),见下面的例子:pragma solidity ^0.4.0;contract Feline { function utterance() public returns (bytes32);}这样的合约不能被编译(即使它们同时包含具体函数和抽象函数),但它们可以用作父合约...翻译 2018-05-21 22:32:19 · 5282 阅读 · 1 评论 -
深入理解Solidity——继承
继承Solidity通过复制包括多态性的代码来支持多重继承。 除非合约是显式给出的,所有的函数调用都是虚拟的,绝大多数派生函数可被调用。 当一个合约继承自多个合约时,只会在区块链上创建单个合约,并将所有父合约中的代码复制到创建的合约中。 Solidity的继承与Python非常相似,特别是多继承。 以下是个例子:pragma solidity ^0.4.16;contract ...翻译 2018-05-21 17:43:04 · 4080 阅读 · 2 评论 -
深入理解Solidity——事件(Events)
事件(Events)事件是使用EVM日志内置功能的方便工具,在dapp的接口中,它可以反过来调用Javascript的监听事件的回调。事件在合约中可被继承。当被调用时,会使参数存储到交易的日志中——一种区块链上的特殊数据结构。这些日志与合约的地址关联,并合并到区块链中,只要区块可以访问就一直存在。日志和事件在合约内不可直接被访问,即使是创建日志的合约。日志的简单支付验证(SPV)是可能...翻译 2018-05-20 23:37:50 · 5927 阅读 · 1 评论 -
深入理解Solidity——函数重载
函数重载(Function Overloading)合约可以有多个同名但不同参数的函数。这也适用于继承的函数。下面示例展示了合约A内对函数f的重载。pragma solidity ^0.4.16;contract A { function f(uint _in) public pure returns (uint out) { out = 1; } ...翻译 2018-05-20 22:39:48 · 1846 阅读 · 0 评论 -
深入理解Solidity——回退函数
回退函数(Fallback Function)一个合约可以有一个匿名函数。此函数不能有参数,不能返回任何值。如果没有其他函数与给定的函数标识符匹配,或者如果根本没有提供数据,将执行一个合约的调用。此外,每当合同接收没有数据的纯Ether时,会执行回退函数。此外,为了接收Ether,回退函数必须标记为payable。如果没有这样的函数,合约不能通过常规transactions接收Ether。...翻译 2018-05-20 00:14:42 · 3527 阅读 · 0 评论 -
深入理解Solidity——纯函数
纯函数(Pure Functions)当承诺不读取或修改状态时,函数可以声明为pure。除了上面解释的修改状态语句的列表之外,以下语句被认为是读取状态:从状态变量读取。访问this.balance或<address>.balance。访问block, tx, msg中的任何成员,除了msg.sig和msg.data之外。调用任何未标记为pure的函数。使用包含某些...翻译 2018-05-20 00:14:31 · 758 阅读 · 0 评论 -
深入理解Solidity——视图函数
视图函数(View Functions)当承诺不修改状态时,函数可以声明view。下面的语句被认为是修改状态:写入状态变量。发生事件。创建其他合约。使用自毁selfdestruct。通过调用发送Ether。调用任何未标记view或pure的函数。使用低级调用(low-level calls)。使用包含某些操作码的内联程序集。pragma solidity ^0.4...翻译 2018-05-20 00:14:16 · 695 阅读 · 0 评论 -
深入理解Solidity——独立汇编
独立汇编(Standalone Assembly)上面介绍的在Solidity中嵌入的内联汇编语言也可以单独使用。实际上,它是被计划用来作为编译器的一种中间语言。在这个目的下,它尝试达到下述的目标:使用它编写的代码要可读,即使代码是从Solidity编译得到的。从汇编语言转为字节码应该尽可能的少坑。控制流应该容易检测来帮助进行形式验证与优化。为了达到第一条和最后一条的目标,So...翻译 2018-05-23 12:12:41 · 803 阅读 · 0 评论 -
深入理解Solidity——存储中状态变量的布局
存储中状态变量的布局(Layout of State Variables in Storage)静态尺寸大小的变量(除了映射和动态尺寸大小的数组类型(的其他类型变量))在存储中,是从位置0连续存储。如果可能的话,不足32个字节的多个条目被紧凑排列在一个单一的存储块,参见以下规则:在存储块中的第一项是存储低阶对齐的。基本类型只使用了正好存储它们的字节数。如果一个基本类型不适合存储块的剩...翻译 2018-05-23 13:07:43 · 1597 阅读 · 0 评论 -
深入理解Solidity——内存布局
内存布局(Layout in Memory)Solidity预留了4个32字节大小的槽位:0x00 - 0x3f: 哈希方法的暂存空间(scratch space)0x40 - 0x5f: 前已分配内存大小,也称空闲内存指针(free memory pointer)0x60 - 0x7f: 零槽(zero slot)暂存空间可在语句之间使用(如在内联编译时使用)。零槽用作动态内...翻译 2018-05-23 13:08:58 · 1535 阅读 · 0 评论 -
【Solidity】风格指南
风格指南概述本指南旨在约定 solidity 代码的编码规范。本指南是不断变化演进的,旧的、过时的编码规范会被淘汰, 而新的、有用的规范会被添加进来。许多项目会实施他们自己的编码风格指南。如遇冲突,应优先使用具体项目的风格指南。本风格指南中的结构和许多建议是取自 python 的 pep8 style guide 。本指南并 不是 以指导正确或最佳的 solidity 编码...翻译 2018-06-01 13:21:12 · 503 阅读 · 0 评论 -
【Solidity】应用二进制接口(ABI)说明
应用二进制接口(ABI) 说明基本设计在以太坊生态系统中, 应用二进制接口Application Binary Interface(ABI) 是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式。 数据会根据其类型按照这份手册中说明的方法进行编码。这种编码并不是可以自描述的,而是需要一种特定的概要(schema)来进行解码。我们假定合约函数的接口都是强类型的,且在编译...翻译 2018-05-24 21:22:52 · 3020 阅读 · 0 评论 -
【Solidity】合约的元数据
合约的元数据Solidity编译器自动生成JSON文件,即合约的元数据,其中包含了当前合约的相关信息。 它可以用于查询编译器版本,所使用的源代码,应用二进制接口Application Binary Interface(ABI) 和 以太坊标准说明格式Ethereum Nature Specification Format(natspec) 文档,以便更安全地与合约进行交互并验证其源代码。编...翻译 2018-05-24 20:48:25 · 841 阅读 · 0 评论 -
【Solidity】使用编译器
使用编译器使用命令行编译器Solidity的其中一个编译器是solc,即Solidity命令行编译器。使用solc --help提供对所有选项的阐述。编译器可以生成各种类型的输出,包括简单的二进制文件、抽象语法树(解析树)的汇编以及预计要花费的gas。如果仅仅想编译一个智能合约,可以用solc --bin sourceFile.sol命令print二进制数据。在部署合约之前,...翻译 2018-05-24 20:42:53 · 1916 阅读 · 0 评论 -
【Solidity】安全考量
安全考量尽管在通常情况下编写一个按照预期运行的软件很简单, 但想要确保没有人能够以出乎意料的方式使用它就困难多了。在 Solidity 中,这一点尤为重要,因为智能合约可以用来处理通证,甚至有可能是更有价值的东西。 除此之外,智能合约的每一次执行都是公开的,而且源代码也通常是容易获得的。当然,你总是需要考虑有多大的风险: 你可以将智能合约与公开的(当然也对恶意用户开放)、甚至是开源的网...翻译 2018-05-23 22:36:47 · 544 阅读 · 0 评论 -
深入理解Solidity——函数可见性定义符、修饰符、保留字和语法
函数可见性定义符(Function Visibility Specifiers)function myFunction() <visibility specifier> returns (bool) { return true;}public:在外部和内部均可见(创建存储/状态变量的访问者函数)private:仅在当前合约中可见external: 只有外部可...翻译 2018-05-23 14:50:51 · 2020 阅读 · 0 评论 -
深入理解Solidity——全局变量
全局变量(Global Variables)abi.encode(...) returns (bytes):对给定的参数进行ABI编码。abi.encodePacked(...) returns (bytes): Performes packed encoding of the given argumentsabi.encodeWithSelector(bytes4 selector, ...翻译 2018-05-23 14:19:25 · 3945 阅读 · 0 评论 -
深入理解Solidity——运算符优先顺序
运算符优先顺序(Order of Precedence of Operators)以下是按evaluation顺序列出的运算符优先顺序。 优先级 描述 运算符 1 Postfix increment and decrement ++, -- 1 New expression new <typename> 1 Arra...翻译 2018-05-23 13:47:14 · 1949 阅读 · 0 评论 -
深入理解Solidity——提示和技巧
提示和技巧在数组中使用delete,就是删除数组中的所有元素。使用较短的类型和结构元素,短类型分组在一起进行排序。SSTORE操作可能合并成一个单一的SSTORE,这可以降低gas的成本(sstore消耗5000或20000 gas,所以这是你必须优化的原因)。使用天gas的价格估算功能(优化器 enable)进行检查!让你的状态变量为public-编译器会自动创建 getters 。...翻译 2018-05-23 13:46:18 · 654 阅读 · 0 评论 -
深入理解Solidity——源文件映射
源文件映射(Source Mappings)作为AST输出的一部分,编译器会提供AST某个节点以应的源代码的范围。这可以被用来做基于AST的静态代码错误分析,可以高亮本地变量,和他们对应使用的调试工具。此外,编译器也可以生成字节码到生成指令源代码的范围映射。这对静态分析工具来说非常重要,它们在字节码级别分析,可以来在调试工具内显示对应代码位置,或支持断点操作。这两种源映射都使用整数标识...翻译 2018-05-23 13:20:22 · 752 阅读 · 0 评论 -
深入理解Solidity——常量
常量(Constant State Variables)状态变量可以被定义为constant。这样的话,它必须在编译期间通过一个表达式赋值。 这种情况下,以下功能的表达式不被允许:访问storage访问区块链数据,如now,this.balance,block.number访问合约执行的中间数据,如msg.gas向外部合约发起调用。可能会造成内存分配副作用表达式是允许的,但...翻译 2018-05-20 00:13:51 · 1791 阅读 · 0 评论 -
深入理解Solidity——函数修饰符
函数修饰符(Function Modifiers)修饰符可以用来轻松改变函数的行为,比如在执行的函数之前自动检查条件。他们可继承合约的属性,也可被派生的合约重写。pragma solidity ^0.4.11;contract owned { function owned() public { owner = msg.sender; } address owner;...翻译 2018-05-20 00:13:18 · 1838 阅读 · 0 评论 -
深入理解Solidity——可见性和Getters
可见性和Getters(Visibility and Getters)Solidity可以理解两种函数调用:“内部调用”,不创建一个真实的EVM调用,也称为“消息调用”“外部调用”,要创建一个真实的EVM调用, 有四种的函数和状态变量的可见性:函数可以被定义为external, public, internal 或 private,默认是 public。状态变量不能为 e...翻译 2018-05-19 21:30:27 · 735 阅读 · 0 评论 -
深入理解Solidity——映射
映射(Mappings)映射类型定义方式为mapping(_KeyType => _KeyValue)。键类型允许除映射、变长数组、合约、枚举、结构体外的几乎所有类型()。值类型没有任何限制,可以为任何类型包括映射类型。映射可以被视作为一个Hash table,所有可能的键会被虚拟化的创建,映射到一个类型的默认值(二进制的全零表示)。在映射表中,并不存储键的数据,仅仅存储它的kecc...翻译 2018-05-17 23:37:21 · 3361 阅读 · 0 评论 -
深入理解Solidity——引用类型
引用类型(Reference Types)引用类型比上述的值类型需要更加小心地处理。因为复制拷贝他们可能开销相当大, 我们必须考虑把它们存储在内存(这不是持久化)或者存储器(状态变量存放的地方)。数据存储位置(Data location)每一个复杂类型,即数组Array和结构体Struct,有一个额外的注解——“数据存储位置”,关系到它是放在在内存还是存储器中。根据上下文会产生一个默...翻译 2018-05-17 23:24:26 · 1234 阅读 · 0 评论 -
深入理解Solidity——值类型
Solidity是一种静态类型语言,这意味着每个变量(状态变量和局部变量)需要在编译时指定类型,或至少可以推倒出类型,请参阅下面的Type Deduction。Solidity提供了几种可以组合形成复杂类型的基本类型。另外,类型可以在包含运算符的表达式中相互交互。有关各种运算符的参考资料,请参阅运算符优先级。值类型(Value Type)以下类型也称为值类型,这类变量在赋值或传参时,总...翻译 2018-05-17 18:29:10 · 2490 阅读 · 0 评论 -
深入理解Solidity——合约结构
合约结构在 Solidity 中,合约类似于面向对象编程语言中的类。 每个合约中可以包含 状态变量、 函数、 函数修饰器、事件、 结构类型、 和 枚举类型 的声明,且合约可以从其他合约继承。状态变量状态变量是永久地存储在合约存储中的值。pragma solidity ^0.4.0;contract SimpleStorage { uint storedData; // ...转载 2018-05-17 15:10:26 · 814 阅读 · 0 评论 -
深入理解Solidity——Solidity源文件结构
Solidity 源文件结构源文件中可以包含任意多个合约定义、导入指令和杂注指令。版本杂注为了避免未来被可能引入不兼容变更的编译器所编译,源文件可以(也应该)被所谓的版本 杂注pragma 所注解。 我们力图把这类变更做到尽可能小,特别是,我们需要以一种当修改语义时必须同步修改语法的方式引入变更,当然这有时候也难以做到。 因此,至少对含重大变更的版本,通读变更日志永远是好办法。 这...转载 2018-05-17 14:58:05 · 1386 阅读 · 0 评论 -
跟着示例学习Solidity——投票
根据例子学习Solidity投票以下的合约相当复杂,但展示了很多Solidity的功能。它实现了一个投票合约。 当然,电子投票的主要问题是如何将投票权分配给正确的人员以及如何防止被操纵。 我们不会在这里解决所有的问题,但至少我们会展示如何进行委托投票,同时,计票又是自动和完全透明的 。我们的想法是为每个(投票)表决创建一份合约,为每个选项提供简称。 然后作为合约的创造者——即主席,...转载 2018-05-17 09:34:28 · 2702 阅读 · 0 评论 -
安装Solidity编译器——从源代码编译
从源代码编译克隆代码库执行以下命令,克隆源代码:git clone --recursive https://github.com/ethereum/solidity.gitcd solidity如果你想参与 Solidity 的开发, 你可分叉 Solidity 源码库后,用你个人的分叉库作为第二远程源:cd soliditygit remote add perso...转载 2018-05-17 09:21:09 · 2992 阅读 · 2 评论 -
安装Solidity编译器
安装Solidity编译器版本Solidity的版本遵循语义化版本原则,作为发布版本的补充, 每日开发构建 (nightly development builds)也是可用的。这个每日开发构建不保证能正常工作,尽管尽了最大的努力,但仍可能包含未记录的和/或重大的改动。我们推荐使用最新的发布版本。下面的包安装程序将使用最新发布版本。Remix我们推荐使用 Remix 来开发简单合约和...转载 2018-05-17 08:58:20 · 5676 阅读 · 0 评论 -
智能合约概述——以太坊虚拟机
以太坊虚拟机 EVM 是智能合约的运行环境。它不仅是沙盒封装的,而且是完全隔离的,也就是说在 EVM 中运行代码是无法访问网络、文件系统和其他进程的。甚至智能合约之间的访问也是受限的。翻译 2018-05-17 00:19:01 · 3220 阅读 · 1 评论 -
智能合约概述——区块链基础
区块链基础对于程序员来说,区块链这个概念并不难理解,这是因为大多数难懂的东西 (挖矿,哈希,椭圆曲线密码学,P2P等) 都只是用于提供特定的功能和承诺。你只需接受这些既有的特性功能,不必关心底层技术,比如,难道你必须知道亚马逊的 AWS 内部原理,你才能使用它吗?交易/事务区块链是全球共享的事务性数据库,这意味着每个人都可加入网络来阅读数据库中的记录。如果你想改变数据库中的某些东西,你...转载 2018-05-16 23:56:16 · 3554 阅读 · 0 评论 -
深入理解Solidity——左值运算符
左值运算符(Operators Involving LValues)如果a是一个左值(LValues),即一个可以赋值给它的变量,可以使用以下的运算符:a += e相当于 a = a + e。 运算符- =,* =,/ =,% =,| =,& =和^ = 都有类似的定义。a++和a--相当于a+ = 1 /a - = 1,--a和++a对a有与上一条相同的效果,但是等值发生改...翻译 2018-05-18 09:51:06 · 978 阅读 · 0 评论 -
深入理解Solidity——隐式转换和显式转换
隐式转换(Implicit Conversions)如果将一个运算符应用于多个不同类型,编译器会试图隐式地把其中一个操作数的类型转换为另一个操作数的类型。赋值操作在同样的情况下也会这样。一般来说,如果转换后不会造成信息会丢失,会自动进行隐式转换:unt8可转换成uint16, int128, int256int8不能转换成uint256,因为uint256放不下负数无符号整数可以...翻译 2018-05-18 10:29:21 · 1845 阅读 · 0 评论 -
Solidity学习教程
为了方便广大区块链技术学习者和爱好者研究智能合约与Solidity语言,博主开始整理和翻译Solidity官方文档,并将本文作为索引页方便研究者针对性学习。原创 2018-05-18 11:22:18 · 5144 阅读 · 4 评论