以太坊去中心化应用开发
文章平均质量分 65
包括Solidity文档翻译、web3.js、truffle等内容
黄嘉成
这个作者很懒,什么都没留下…
展开
-
js解析智能合约Solidity返回的struct
Solidity是以太坊智能合约的编程语言,我们可以通过web3.js来与合约进行通信,并接收Solidity函数的返回值。不少人在接收struct类型的返回值时不知道怎么处理,本文展示一种解析方法,以供各位学习交流,如有更好的方法,欢迎讨论。原创 2018-08-03 12:52:27 · 6160 阅读 · 5 评论 -
区块链开发之Truffle环境搭建
truffle是以太坊目前最流行的一个开发框架,通过truffle我们可以开发基于以太坊的去中心化应用(Dapp)。这篇文章介绍如何安装truffle并运行第一个Dapp程序。原创 2018-05-11 21:26:23 · 1392 阅读 · 1 评论 -
【Solidity】Storage和memory关键字的区别和用法
在 Solidity 中,有两个地方可以存储变量 —— storage以及memory。Storage 变量是指永久存储在区块链中的变量。 Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。状态变量(在函数之外声明的变量)默认为“storage”形式,并永久写入区块链;而在函数内部声明的变量默认是“memory”型的,它们函数调用结束后消失。然而也有一些情...原创 2018-05-26 10:15:37 · 12310 阅读 · 2 评论 -
【Solidity】internal、private、external、public区别
public与private对于public和private,相信学过其他主流语言的人都能明白:public修饰的变量和函数,任何用户或者合约都能调用和访问。private修饰的变量和函数,只能在其所在的合约中调用和访问,即使是其子合约也没有权限访问。external和internal除 public 和 private 属性之外,Solidity 还使用了另外两个描述函...原创 2018-05-26 11:02:50 · 24725 阅读 · 3 评论 -
【Solidity】函数returns多个值的接收方式
函数返回多个值学习过javascript或其他编程语言的童鞋看到Solidity中的函数可以有多返回值肯会有些惊讶(如下图),不知道该怎么对多返回值的函数进行接收。其实方法很简单的。// 函数可以返回多个值function multipleReturns() returns(uint a, uint b, uint c) { return (1, 2, 3);}同时接收所有返...原创 2018-05-26 11:26:30 · 6769 阅读 · 0 评论 -
【Solidity】Gas estimation failed-Gas estimation errored with the following message
今天在写完合约在remix部署测试的时候遇到了这么一个问题,一旦向合约里写数据就出现如下错误: Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending? 如下图所示: 经过...原创 2018-05-31 17:17:14 · 11474 阅读 · 2 评论 -
使用truffle-contract与以太坊主链合约通信
truffle-contract与web3.js一样,都是用来与以太坊智能合约交互的JS库,但是相对于web3.js来说,truffle-contract封装得更简单一些,本文示范如何通过truffle-contract与以太坊主链上部署好的合约通信。第一步引入相关的包和合约ABI文件,并通过contract(abi)函数得到合约对象,ABI文件可以通过truffle comile命令对sol...原创 2018-06-03 19:38:14 · 2394 阅读 · 0 评论 -
智能合约概述——存储
Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性。下面您将会看到,使用 Solidity 语言,可以为投票、众筹、秘密竞价(盲拍)、多重签名的钱包以及其他应用创建合约。转载 2018-05-16 23:44:53 · 3830 阅读 · 0 评论 -
智能合约概述——区块链基础
区块链基础对于程序员来说,区块链这个概念并不难理解,这是因为大多数难懂的东西 (挖矿,哈希,椭圆曲线密码学,P2P等) 都只是用于提供特定的功能和承诺。你只需接受这些既有的特性功能,不必关心底层技术,比如,难道你必须知道亚马逊的 AWS 内部原理,你才能使用它吗?交易/事务区块链是全球共享的事务性数据库,这意味着每个人都可加入网络来阅读数据库中的记录。如果你想改变数据库中的某些东西,你...转载 2018-05-16 23:56:16 · 3566 阅读 · 0 评论 -
智能合约概述——以太坊虚拟机
以太坊虚拟机 EVM 是智能合约的运行环境。它不仅是沙盒封装的,而且是完全隔离的,也就是说在 EVM 中运行代码是无法访问网络、文件系统和其他进程的。甚至智能合约之间的访问也是受限的。翻译 2018-05-17 00:19:01 · 3249 阅读 · 1 评论 -
安装Solidity编译器
安装Solidity编译器版本Solidity的版本遵循语义化版本原则,作为发布版本的补充, 每日开发构建 (nightly development builds)也是可用的。这个每日开发构建不保证能正常工作,尽管尽了最大的努力,但仍可能包含未记录的和/或重大的改动。我们推荐使用最新的发布版本。下面的包安装程序将使用最新发布版本。Remix我们推荐使用 Remix 来开发简单合约和...转载 2018-05-17 08:58:20 · 5704 阅读 · 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 · 3042 阅读 · 2 评论 -
跟着示例学习Solidity——投票
根据例子学习Solidity投票以下的合约相当复杂,但展示了很多Solidity的功能。它实现了一个投票合约。 当然,电子投票的主要问题是如何将投票权分配给正确的人员以及如何防止被操纵。 我们不会在这里解决所有的问题,但至少我们会展示如何进行委托投票,同时,计票又是自动和完全透明的 。我们的想法是为每个(投票)表决创建一份合约,为每个选项提供简称。 然后作为合约的创造者——即主席,...转载 2018-05-17 09:34:28 · 2763 阅读 · 0 评论 -
深入理解Solidity——Solidity源文件结构
Solidity 源文件结构源文件中可以包含任意多个合约定义、导入指令和杂注指令。版本杂注为了避免未来被可能引入不兼容变更的编译器所编译,源文件可以(也应该)被所谓的版本 杂注pragma 所注解。 我们力图把这类变更做到尽可能小,特别是,我们需要以一种当修改语义时必须同步修改语法的方式引入变更,当然这有时候也难以做到。 因此,至少对含重大变更的版本,通读变更日志永远是好办法。 这...转载 2018-05-17 14:58:05 · 1397 阅读 · 0 评论 -
深入理解Solidity——合约结构
合约结构在 Solidity 中,合约类似于面向对象编程语言中的类。 每个合约中可以包含 状态变量、 函数、 函数修饰器、事件、 结构类型、 和 枚举类型 的声明,且合约可以从其他合约继承。状态变量状态变量是永久地存储在合约存储中的值。pragma solidity ^0.4.0;contract SimpleStorage { uint storedData; // ...转载 2018-05-17 15:10:26 · 828 阅读 · 0 评论 -
深入理解Solidity——值类型
Solidity是一种静态类型语言,这意味着每个变量(状态变量和局部变量)需要在编译时指定类型,或至少可以推倒出类型,请参阅下面的Type Deduction。Solidity提供了几种可以组合形成复杂类型的基本类型。另外,类型可以在包含运算符的表达式中相互交互。有关各种运算符的参考资料,请参阅运算符优先级。值类型(Value Type)以下类型也称为值类型,这类变量在赋值或传参时,总...翻译 2018-05-17 18:29:10 · 2535 阅读 · 0 评论 -
深入理解Solidity——引用类型
引用类型(Reference Types)引用类型比上述的值类型需要更加小心地处理。因为复制拷贝他们可能开销相当大, 我们必须考虑把它们存储在内存(这不是持久化)或者存储器(状态变量存放的地方)。数据存储位置(Data location)每一个复杂类型,即数组Array和结构体Struct,有一个额外的注解——“数据存储位置”,关系到它是放在在内存还是存储器中。根据上下文会产生一个默...翻译 2018-05-17 23:24:26 · 1266 阅读 · 0 评论 -
深入理解Solidity——映射
映射(Mappings)映射类型定义方式为mapping(_KeyType => _KeyValue)。键类型允许除映射、变长数组、合约、枚举、结构体外的几乎所有类型()。值类型没有任何限制,可以为任何类型包括映射类型。映射可以被视作为一个Hash table,所有可能的键会被虚拟化的创建,映射到一个类型的默认值(二进制的全零表示)。在映射表中,并不存储键的数据,仅仅存储它的kecc...翻译 2018-05-17 23:37:21 · 3461 阅读 · 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 · 995 阅读 · 0 评论 -
深入理解Solidity——隐式转换和显式转换
隐式转换(Implicit Conversions)如果将一个运算符应用于多个不同类型,编译器会试图隐式地把其中一个操作数的类型转换为另一个操作数的类型。赋值操作在同样的情况下也会这样。一般来说,如果转换后不会造成信息会丢失,会自动进行隐式转换:unt8可转换成uint16, int128, int256int8不能转换成uint256,因为uint256放不下负数无符号整数可以...翻译 2018-05-18 10:29:21 · 1893 阅读 · 0 评论 -
Solidity学习教程
为了方便广大区块链技术学习者和爱好者研究智能合约与Solidity语言,博主开始整理和翻译Solidity官方文档,并将本文作为索引页方便研究者针对性学习。原创 2018-05-18 11:22:18 · 5186 阅读 · 4 评论 -
深入理解Solidity——单位和全局变量
货币单位(Ether Units)wei,finney,szabo或ether可以在Solidity中作为货币单位并可以进行相互转换。没有单位的数字默认是Wei。单位之间的转化规则如下:1 ether == 10^3 finney 1 ether == 10^6 szabo1 ether == 10^18 wei例如,表达式2 ether == 2000 finney返...翻译 2018-05-18 15:19:51 · 2112 阅读 · 0 评论 -
深入理解Solidity——输入输出参数
输入参数和输出参数(Input Parameters and Output Parameters)与JavaScript一样,函数可以将多个参数作为输入,但与Javascript和C不同的是,Solidity的函数可以返回任意数量的参数作为输出。输入参数(Input Parameters)输入参数的声明方式与变量相同。不过有一个不同之处:输入参数中未使用的参数可以省略变量名。例如,假设...翻译 2018-05-19 15:10:24 · 3542 阅读 · 0 评论 -
深入理解Solidity——创建合约
合约(Contracts)Solidity的合约类似于面向对象语言中的类。它们包含存放持久化数据的状态变量和可修改这些变量的函数。调用不同的合约实例上的函数将执行EVM函数调用,从而切换上下文,使得状态变量不可访问。创建合约(Creating Contracts)合约可以从“外部”创建,也可以由Solidity合约创立。像Remix这类IDE,可以用UI界面使创建过程无缝连接。...翻译 2018-05-19 18:50:16 · 2018 阅读 · 0 评论 -
智能合约概述——子货币
子货币(Subcurrency)例子下面的合约实现了一个最简单的加密货币。这里,币确实可以无中生有地产生,但是只有创建合约的人才能做到(实现一个不同的发行计划也不难)。而且,任何人都可以给其他人转币,不需要注册用户名和密码 —— 所需要的只是以太坊密钥对。pragma solidity ^0.4.21;contract Coin { // 关键字“public”让这些变量可...翻译 2018-05-19 19:43:53 · 1311 阅读 · 1 评论 -
跟着示例学习Solidity——简单的公开拍卖
简单的公开拍卖以下简单的拍卖合约的总体思路是每个人都可以在投标期内发送他们的出价。 出价已经包含了资金/以太币,来将投标人与他们的投标绑定。 如果最高出价提高了(被其他出价者的出价超过),之前出价最高的出价者可以拿回她的钱。 在投标期结束后,受益人需要手动调用合约来接收他的钱 - 合约不能自己激活接收。pragma solidity ^0.4.21;contract SimpleAuc...转载 2018-05-19 20:01:53 · 2072 阅读 · 0 评论 -
跟着示例学习Solidity——秘密竞价(盲拍)
在本节中,我们将展示如何轻松地在以太坊上创建一个秘密竞价的合约。 我们将从公开拍卖开始,每个人都可以看到出价,然后将此合约扩展到盲拍合约, 在竞标期结束之前无法看到实际出价。秘密竞价(盲拍)之前的公开拍卖接下来将被扩展为一个秘密竞拍。 秘密竞拍的好处是在投标结束前不会有时间压力。 在一个透明的计算平台上进行秘密竞拍听起来像是自相矛盾,但密码学可以实现它。在 投标期间 ,投标人实际上并没...转载 2018-05-19 20:03:33 · 2219 阅读 · 0 评论 -
跟着示例学习Solidity——安全的远程购买
安全的远程购买pragma solidity ^0.4.21;contract Purchase { uint public value; address public seller; address public buyer; enum State { Created, Locked, Inactive } State public state;...转载 2018-05-19 20:04:32 · 943 阅读 · 0 评论 -
深入理解Solidity——函数调用和赋值
函数调用(Function Calls)内部函数调用(Internal Function Calls)当前合约的函数可以直接内部(Internal)调用,也可以递归地调用,比如这个古怪的例子:pragma solidity ^0.4.16;contract C { function g(uint a) public pure returns (uint ret) {...翻译 2018-05-19 20:38:45 · 5161 阅读 · 0 评论 -
深入理解Solidity——作用域和声明
作用域和声明(Scoping and Declarations)已声明的变量将具有其字节表示为全0的初始值。变量的初始值是任何类型的典型“零状态”(“zero-state)。例如,bool的初始值为false。uint或int类型的默认值为0。对于静态大小的数组和bytes1到bytes32,每个单独的元素将被初始化为对应于其类型的初始值。对于动态大小的数组、bytes和string,...翻译 2018-05-19 20:40:11 · 880 阅读 · 0 评论 -
深入理解Solidity——Assert, Require, Revert 和 Exceptions
Assert, Require, Revert 和 ExceptionsSolidity使用state-reverting异常来处理错误。 这种异常将回滚当前调用(及其所有子调用)状态的所有变化,并将错误标志给调用者。 函数assert和require可以用于检查条件,如果条件不满足则抛出异常。 assert函数只能用于测试内部错误,并检查不变量。 应该使用require函数来确认i...翻译 2018-05-19 20:42:51 · 5480 阅读 · 0 评论 -
深入理解Solidity——可见性和Getters
可见性和Getters(Visibility and Getters)Solidity可以理解两种函数调用:“内部调用”,不创建一个真实的EVM调用,也称为“消息调用”“外部调用”,要创建一个真实的EVM调用, 有四种的函数和状态变量的可见性:函数可以被定义为external, public, internal 或 private,默认是 public。状态变量不能为 e...翻译 2018-05-19 21:30:27 · 774 阅读 · 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 · 1892 阅读 · 0 评论 -
深入理解Solidity——常量
常量(Constant State Variables)状态变量可以被定义为constant。这样的话,它必须在编译期间通过一个表达式赋值。 这种情况下,以下功能的表达式不被允许:访问storage访问区块链数据,如now,this.balance,block.number访问合约执行的中间数据,如msg.gas向外部合约发起调用。可能会造成内存分配副作用表达式是允许的,但...翻译 2018-05-20 00:13:51 · 1833 阅读 · 0 评论 -
深入理解Solidity——视图函数
视图函数(View Functions)当承诺不修改状态时,函数可以声明view。下面的语句被认为是修改状态:写入状态变量。发生事件。创建其他合约。使用自毁selfdestruct。通过调用发送Ether。调用任何未标记view或pure的函数。使用低级调用(low-level calls)。使用包含某些操作码的内联程序集。pragma solidity ^0.4...翻译 2018-05-20 00:14:16 · 716 阅读 · 0 评论 -
深入理解Solidity——纯函数
纯函数(Pure Functions)当承诺不读取或修改状态时,函数可以声明为pure。除了上面解释的修改状态语句的列表之外,以下语句被认为是读取状态:从状态变量读取。访问this.balance或<address>.balance。访问block, tx, msg中的任何成员,除了msg.sig和msg.data之外。调用任何未标记为pure的函数。使用包含某些...翻译 2018-05-20 00:14:31 · 773 阅读 · 0 评论 -
深入理解Solidity——回退函数
回退函数(Fallback Function)一个合约可以有一个匿名函数。此函数不能有参数,不能返回任何值。如果没有其他函数与给定的函数标识符匹配,或者如果根本没有提供数据,将执行一个合约的调用。此外,每当合同接收没有数据的纯Ether时,会执行回退函数。此外,为了接收Ether,回退函数必须标记为payable。如果没有这样的函数,合约不能通过常规transactions接收Ether。...翻译 2018-05-20 00:14:42 · 3566 阅读 · 0 评论 -
深入理解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 · 1887 阅读 · 0 评论 -
深入理解Solidity——事件(Events)
事件(Events)事件是使用EVM日志内置功能的方便工具,在dapp的接口中,它可以反过来调用Javascript的监听事件的回调。事件在合约中可被继承。当被调用时,会使参数存储到交易的日志中——一种区块链上的特殊数据结构。这些日志与合约的地址关联,并合并到区块链中,只要区块可以访问就一直存在。日志和事件在合约内不可直接被访问,即使是创建日志的合约。日志的简单支付验证(SPV)是可能...翻译 2018-05-20 23:37:50 · 6002 阅读 · 1 评论 -
深入理解Solidity——继承
继承Solidity通过复制包括多态性的代码来支持多重继承。 除非合约是显式给出的,所有的函数调用都是虚拟的,绝大多数派生函数可被调用。 当一个合约继承自多个合约时,只会在区块链上创建单个合约,并将所有父合约中的代码复制到创建的合约中。 Solidity的继承与Python非常相似,特别是多继承。 以下是个例子:pragma solidity ^0.4.16;contract ...翻译 2018-05-21 17:43:04 · 4127 阅读 · 2 评论