如何升级Truffle到v5.0.0使用Solidity v0.5.0新特性?

1, 摘要

本文介绍如何升级Truffle到v5.0.0的方法便于编译使用Solidity v0.5.0,同时也介绍了一下Solidity v0.5.0新特性。

2,操作步骤

2.1 查看TRUFFLE版本并卸载

之前一直在用TRUFFLE 4.0版本,最近使用REMIX编译时发现Solidity 已升级到v0.5.0了。为了使用Solidity v0.5.0新特性,TRUFFLE的版本也要配套升级了。
先查看版本,然后卸载truffleV4.1.11旧版本。

duncanwang@ubuntu:~/work/dapp-guide-pet-shop$ truffle version
Truffle v4.1.11 (core: 4.1.11)
Solidity v0.4.24 (solc-js)

duncanwang@ubuntu:~/work/dapp-guide-pet-shop$ sudo npm uninstall -g truffle
[sudo] password for duncanwang: 
removed 81 packages in 1.852s

2.2 升级truffle到5.0版本

在npm中安装固定的版本号package,只需要在其后加 ‘@版本号’。

npm install -g truffle@5.0.0

安装时存在错误提示,暂时不用管,不影响使用。

duncanwang@ubuntu:~/work/dapp-guide-pet-shop$ sudo npm install -g truffle@5.0.0
/usr/bin/truffle -> /usr/lib/node_modules/truffle/build/cli.bundled.js

> keccak@1.4.0 install /usr/lib/node_modules/truffle/node_modules/keccak
> npm run rebuild || echo "Keccak bindings compilation fail. Pure JS implementation will be used."


> keccak@1.4.0 rebuild /usr/lib/node_modules/truffle/node_modules/keccak
> node-gyp rebuild

gyp ERR! configure error 
gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/lib/node_modules/truffle/node_modules/keccak/build'
gyp ERR! System Linux 4.13.0-46-generic
gyp ERR! command "/usr/bin/node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /usr/lib/node_modules/truffle/node_modules/keccak
gyp ERR! node -v v9.11.1
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok 
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! keccak@1.4.0 rebuild: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the keccak@1.4.0 rebuild script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/duncanwang/.npm/_logs/2018-12-20T05_33_47_253Z-debug.log
Keccak bindings compilation fail. Pure JS implementation will be used.
+ truffle@5.0.0
added 89 packages from 305 contributors in 22.714s

查看版本,发现已经切换为V5.0.0版本了。

duncanwang@ubuntu:~/work/dapp-guide-pet-shop$ truffle version
{ mnemonic_ropsten: 'mosquito electric slim hybrid craft change shrimp digital car wonder term oven',
  mnemonic_mainnet: '' }
Truffle v5.0.0 (core: 5.0.0)
Solidity v0.5.0 (solc-js)
Node v9.11.1

2.3 智能合约.sol文件可以使用新版本

关键字:

pragma solidity ^0.5.0;

3, Solidity 0.5.0新特性

Solidity 0.5.0 于11月13日正式发布, 此版本中包含了许多重要更新。

3.1 Solidity 0.5.0 新增语法

  • 增加新的关键字calldata, constructor

  • 新的保留关键字alias, apply, auto, copyof, define, immutable,

    implements, macro, mutable, override, partial, promise, reference,

    sealed, sizeof, supports, typedef and unchecked

  • 函数call/ delegatecall/ staticcall/ keccak256/ sha256/ ripemd160只接受一

    个类型为bytes的参数,并且不会对此参数进行pad。

  • call/delegatecall/staticcall现在返回(bool, bytes memory),这样既能检

    查操作是否成功,也能操作返回的数据。所以需要将之前的写法

    改为

  • 现在Solidity对函数内局部变量采用C99类型的作用域解析规则,也就是变量只能在被声明后使用并且只在同一个作用域或者其下嵌套的(更深层次)作用域可见。在for循环的初始化部分定义的变量在整个循环内可见。

3.2 Solidity 0.5.0 丢弃/禁止使用的特性

  • 构造函数必须用constructor关键字定义,而不是与合约同名的函数
  • 不允许调用的函数
  • callcode (推荐使用delegatecall)
  • suicide (推荐使用selfdestruct)
  • sha3 (推荐使用keccak256)
  • throw (推荐使用revert, require, assert)
  • 类型转换
  • 不允许十进制数值往bytesXX的转换(显式或隐式)
  • 不允许十六进制数值往不同大小的bytesXX的转换(显式或隐式)
  • 不允许使用years
  • 十六进制值后不允许加单位(比如0x1e wei)
  • 十六进制值不允许用0X,只能使用0x
  • 变量相关
  • 不允许声明空的struct
  • 不允许使用var,要显式指定变量类型
  • 不允许不同数目的tuple相互赋值
  • 不允许编译期不能确定的常量
  • 存储类型的变量必须初始化
  • 不允许空的tuple
  • 固定大小的数组长度不能为0
  • 语法相关
  • 不允许使用constant作为函数的modifier (使用view,pure)
  • 布尔表达式不能进行算术操作
  • 不允许使用一元的+
  • 不允许将未转化为具体类型的数值当做abi.encodePacked的参数
  • 汇编中不允许使用jump,label以及非函数风格的指令
  • 没实现的函数不允许使用modifier
  • 函数类型中不允许包含返回值的名字,比如


3.3 continue在do-while中的行为

当遇到循环体中的continue时,0.5.0中下一步会检查while中的条件,而之前则跳回执行循环体。0.5.0的行为与其他编程语言的处理保持一致。


solidity 0.5.0中返回3,0.4.x 版本返回4

3.4 有符号数的算术右移

之前Solidity中的算术右移是用除法实现,所以对负数做右移时,效果为向0靠拢,但在其他编程语言中表现为向负无穷靠拢。在0.5.0中,此操作的行为与其他语言保持一致。


上述代码,0.5.0返回-1,而0.4.x返回0

3.5 call/staticcall/delegatecall

这三个函数如果只给定一个bytes类型的参数,不进行任何pad操作。

pure/view操作码(opcode)改为STATICCALL

声明为view的函数不修改状态。修改状态的行为包括

  • 写状态变量

  • emit event

  • 创建新的合约

  • 调用selfdestruct

  • 发送Ether

  • 调用其他未被标记为pure、view的函数

  • 使用了底层调用

  • 使用了包含某些操作码的内联汇编代码

声明为pure的函数既不读取状态也不修改状态。读取状态的行为包括:

  • 读取状态变量

  • 访问某个地址的balance变量, address(this).balance , .balance.

  • 访问block、tx、msg的成员(不包括msg.sig msg.data)

  • 调用任何未标记为pure的函数

  • 使用了包含某些操作码的内联汇编代码

在 0.5.0 之前,pure/view函数中可以使用非法的类型转换绕过对pure/view的语义限制,而在新版本中,使用STATICCALL在EVM层面保证了语义安全。

3.6 外部函数调用

从Tangerine Whistle起,调用外部函数时,该外部函数共享所有可用gas。

3.7 显式要求

  • 函数的可见性(pure/external/view)强制显式定义。

  • 所有struct/array/mapping类型变量的数据存储类型强制显式定义。

    比如原有写法

已经不合法,需要显式指明x的存储类型,比如

image

再比如

image

也不合法,需要指明参数x的存储类型

注意external类型的函数需要参数的数据存储类型为calldata

  • Contract类型不再包含address成员。所以要显式将其转为address, 比如c为一个合约

    要修改为

  • 禁止无关合约类型变量之间的转换,通常情况下只能在合约有直接或间接继承关系时,才可以进行类型转换。如果你确定他们不存在这种关系,但是接口上是相符的,还是想进行转换,比如A与B是两个合约类型,他们之间不存在继承关系,b是一个类型为B的合约,那么可以用A(address(b))将b转为A类型。

  • address类型分解为address与address payable两种,只有address payable提 供transfer函数。一个address payable可以直接转换为address,反之则不行。 可以用如下方法将address转换为address payable

    如果c是一个合约,address(c)仅当c有一个payable的fallback函数时返回 address payable。

    如果合约实现时,使用了withdraw模式,是不需要修改现有代码,因为合约中 并不需要直接往存储的地址进行转账操作,所有转账操作是由msg.sender发起 的,而msg.sender是address payable。

  • 禁止不同大小的bytesX与uintY的转换,因为bytesX在右端补齐,而uintY在左 端,这可能会导致异常转换。现在必须先将大小调制为一致,再进行转换。比 如,要将bytes4 (4 bytes)转换为uint64(8 bytes),需要先将byte4转换为bytes8。

  • 禁止在non-payble的函数中使用msg.value。要么将该函数修改为payable,要么专门定义一个新的内部函数来使用msg.value

4,参考

(1)NPM安装命令和版本
(2)首发| Solidity 0.5.0安全迁移指南(一)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 前言 随着solidity 0.5.0 nightly build版本的稳步推进,正式版也将在不久的将来与开发者见...
    黑白灰的绿i阅读 853评论 0 0
  • 以太坊不仅是一种加密数字货币,它更是功能完备的智能合约平台,solidity就是用来开发以太坊上的智能合约的原生开...
    编程狂魔阅读 1,529评论 0 1
  • 上一篇:智能合约编程语言 - solidity快速入门(上) solidity区块及交易属性 在介绍区块及交易属性...
    端碗吹水阅读 1,931评论 0 3
  • (注:本文是在原文的基础上,根据个人的理解,修改部分内容并添加了一些注释) 买卖部分代码未调试通过 基础版的代币合...
    中v中阅读 2,880评论 0 2
  • 第一次租房是在2016年,大二升大三的暑假,那时我在优衣库兼职,是我人生中的第一份工作,同事多是如我一样的学生。在...
    他样故事刊阅读 323评论 0 9