如何升級(jí)Truffle到v5.0.0使用Solidity v0.5.0新特性弛姜?

1糜芳, 摘要

本文介紹如何升級(jí)Truffle到v5.0.0的方法便于編譯使用Solidity v0.5.0飒货,同時(shí)也介紹了一下Solidity v0.5.0新特性。

2峭竣,操作步驟

2.1 查看TRUFFLE版本并卸載

之前一直在用TRUFFLE 4.0版本塘辅,最近使用REMIX編譯時(shí)發(fā)現(xiàn)Solidity 已升級(jí)到v0.5.0了。為了使用Solidity v0.5.0新特性皆撩,TRUFFLE的版本也要配套升級(jí)了莫辨。
先查看版本,然后卸載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 升級(jí)truffle到5.0版本

在npm中安裝固定的版本號(hào)package沮榜,只需要在其后加 ‘@版本號(hào)’。

npm install -g truffle@5.0.0

安裝時(shí)存在錯(cuò)誤提示喻粹,暫時(shí)不用管蟆融,不影響使用。

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

查看版本守呜,發(fā)現(xiàn)已經(jīng)切換為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文件可以使用新版本

關(guān)鍵字:

pragma solidity ^0.5.0;

3, Solidity 0.5.0新特性

Solidity 0.5.0 于11月13日正式發(fā)布, 此版本中包含了許多重要更新查乒。

3.1 Solidity 0.5.0 新增語法

  • 增加新的關(guān)鍵字calldata, constructor

  • 新的保留關(guān)鍵字alias, apply, auto, copyof, define, immutable,

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

    sealed, sizeof, supports, typedef and unchecked

  • 函數(shù)call/ delegatecall/ staticcall/ keccak256/ sha256/ ripemd160只接受一

    個(gè)類型為bytes的參數(shù)弥喉,并且不會(huì)對(duì)此參數(shù)進(jìn)行pad。

  • call/delegatecall/staticcall現(xiàn)在返回(bool, bytes memory)玛迄,這樣既能檢

    查操作是否成功由境,也能操作返回的數(shù)據(jù)。所以需要將之前的寫法

    改為

  • 現(xiàn)在Solidity對(duì)函數(shù)內(nèi)局部變量采用C99類型的作用域解析規(guī)則蓖议,也就是變量只能在被聲明后使用并且只在同一個(gè)作用域或者其下嵌套的(更深層次)作用域可見虏杰。在for循環(huán)的初始化部分定義的變量在整個(gè)循環(huán)內(nèi)可見。

3.2 Solidity 0.5.0 丟棄/禁止使用的特性

  • 構(gòu)造函數(shù)必須用constructor關(guān)鍵字定義勒虾,而不是與合約同名的函數(shù)
  • 不允許調(diào)用的函數(shù)
  • callcode (推薦使用delegatecall)
  • suicide (推薦使用selfdestruct)
  • sha3 (推薦使用keccak256)
  • throw (推薦使用revert, require, assert)
  • 類型轉(zhuǎn)換
  • 不允許十進(jìn)制數(shù)值往bytesXX的轉(zhuǎn)換(顯式或隱式)
  • 不允許十六進(jìn)制數(shù)值往不同大小的bytesXX的轉(zhuǎn)換(顯式或隱式)
  • 不允許使用years
  • 十六進(jìn)制值后不允許加單位(比如0x1e wei)
  • 十六進(jìn)制值不允許用0X,只能使用0x
  • 變量相關(guān)
  • 不允許聲明空的struct
  • 不允許使用var纺阔,要顯式指定變量類型
  • 不允許不同數(shù)目的tuple相互賦值
  • 不允許編譯期不能確定的常量
  • 存儲(chǔ)類型的變量必須初始化
  • 不允許空的tuple
  • 固定大小的數(shù)組長(zhǎng)度不能為0
  • 語法相關(guān)
  • 不允許使用constant作為函數(shù)的modifier (使用view腐缤,pure)
  • 布爾表達(dá)式不能進(jìn)行算術(shù)操作
  • 不允許使用一元的+
  • 不允許將未轉(zhuǎn)化為具體類型的數(shù)值當(dāng)做abi.encodePacked的參數(shù)
  • 匯編中不允許使用jump撞蚕,label以及非函數(shù)風(fēng)格的指令
  • 沒實(shí)現(xiàn)的函數(shù)不允許使用modifier
  • 函數(shù)類型中不允許包含返回值的名字,比如


3.3 continue在do-while中的行為

當(dāng)遇到循環(huán)體中的continue時(shí)聪富,0.5.0中下一步會(huì)檢查while中的條件,而之前則跳回執(zhí)行循環(huán)體玻靡。0.5.0的行為與其他編程語言的處理保持一致拯杠。


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

3.4 有符號(hào)數(shù)的算術(shù)右移

之前Solidity中的算術(shù)右移是用除法實(shí)現(xiàn)啃奴,所以對(duì)負(fù)數(shù)做右移時(shí),效果為向0靠攏雄妥,但在其他編程語言中表現(xiàn)為向負(fù)無窮靠攏最蕾。在0.5.0中,此操作的行為與其他語言保持一致老厌。


上述代碼瘟则,0.5.0返回-1,而0.4.x返回0

3.5 call/staticcall/delegatecall

這三個(gè)函數(shù)如果只給定一個(gè)bytes類型的參數(shù)枝秤,不進(jìn)行任何pad操作醋拧。

pure/view操作碼(opcode)改為STATICCALL

聲明為view的函數(shù)不修改狀態(tài)。修改狀態(tài)的行為包括

  • 寫狀態(tài)變量

  • emit event

  • 創(chuàng)建新的合約

  • 調(diào)用selfdestruct

  • 發(fā)送Ether

  • 調(diào)用其他未被標(biāo)記為pure淀弹、view的函數(shù)

  • 使用了底層調(diào)用

  • 使用了包含某些操作碼的內(nèi)聯(lián)匯編代碼

聲明為pure的函數(shù)既不讀取狀態(tài)也不修改狀態(tài)丹壕。讀取狀態(tài)的行為包括:

  • 讀取狀態(tài)變量

  • 訪問某個(gè)地址的balance變量, address(this).balance , .balance.

  • 訪問block、tx薇溃、msg的成員(不包括msg.sig msg.data)

  • 調(diào)用任何未標(biāo)記為pure的函數(shù)

  • 使用了包含某些操作碼的內(nèi)聯(lián)匯編代碼

在 0.5.0 之前菌赖,pure/view函數(shù)中可以使用非法的類型轉(zhuǎn)換繞過對(duì)pure/view的語義限制,而在新版本中沐序,使用STATICCALL在EVM層面保證了語義安全琉用。

3.6 外部函數(shù)調(diào)用

從Tangerine Whistle起,調(diào)用外部函數(shù)時(shí)策幼,該外部函數(shù)共享所有可用gas邑时。

3.7 顯式要求

  • 函數(shù)的可見性(pure/external/view)強(qiáng)制顯式定義。

  • 所有struct/array/mapping類型變量的數(shù)據(jù)存儲(chǔ)類型強(qiáng)制顯式定義特姐。

    比如原有寫法

已經(jīng)不合法晶丘,需要顯式指明x的存儲(chǔ)類型,比如

image

再比如

image

也不合法唐含,需要指明參數(shù)x的存儲(chǔ)類型

注意external類型的函數(shù)需要參數(shù)的數(shù)據(jù)存儲(chǔ)類型為calldata

  • Contract類型不再包含address成員铣口。所以要顯式將其轉(zhuǎn)為address, 比如c為一個(gè)合約

    要修改為

  • 禁止無關(guān)合約類型變量之間的轉(zhuǎn)換,通常情況下只能在合約有直接或間接繼承關(guān)系時(shí)觉壶,才可以進(jìn)行類型轉(zhuǎn)換脑题。如果你確定他們不存在這種關(guān)系,但是接口上是相符的铜靶,還是想進(jìn)行轉(zhuǎn)換叔遂,比如A與B是兩個(gè)合約類型他炊,他們之間不存在繼承關(guān)系,b是一個(gè)類型為B的合約已艰,那么可以用A(address(b))將b轉(zhuǎn)為A類型痊末。

  • address類型分解為address與address payable兩種,只有address payable提 供transfer函數(shù)哩掺。一個(gè)address payable可以直接轉(zhuǎn)換為address凿叠,反之則不行。 可以用如下方法將address轉(zhuǎn)換為address payable

    如果c是一個(gè)合約嚼吞,address(c)僅當(dāng)c有一個(gè)payable的fallback函數(shù)時(shí)返回 address payable盒件。

    如果合約實(shí)現(xiàn)時(shí),使用了withdraw模式舱禽,是不需要修改現(xiàn)有代碼炒刁,因?yàn)楹霞s中 并不需要直接往存儲(chǔ)的地址進(jìn)行轉(zhuǎn)賬操作,所有轉(zhuǎn)賬操作是由msg.sender發(fā)起 的誊稚,而msg.sender是address payable翔始。

  • 禁止不同大小的bytesX與uintY的轉(zhuǎn)換,因?yàn)閎ytesX在右端補(bǔ)齊里伯,而uintY在左 端城瞎,這可能會(huì)導(dǎo)致異常轉(zhuǎn)換。現(xiàn)在必須先將大小調(diào)制為一致疾瓮,再進(jìn)行轉(zhuǎn)換全谤。比 如,要將bytes4 (4 bytes)轉(zhuǎn)換為uint64(8 bytes)爷贫,需要先將byte4轉(zhuǎn)換為bytes8认然。

  • 禁止在non-payble的函數(shù)中使用msg.value。要么將該函數(shù)修改為payable漫萄,要么專門定義一個(gè)新的內(nèi)部函數(shù)來使用msg.value

4卷员,參考

(1)NPM安裝命令和版本
(2)首發(fā)| Solidity 0.5.0安全遷移指南(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腾务,隨后出現(xiàn)的幾起案子毕骡,更是在濱河造成了極大的恐慌,老刑警劉巖岩瘦,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件未巫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡启昧,警方通過查閱死者的電腦和手機(jī)叙凡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來密末,“玉大人握爷,你說我怎么就攤上這事跛璧。” “怎么了新啼?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵追城,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我燥撞,道長(zhǎng)座柱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任物舒,我火速辦了婚禮色洞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茶鉴。我一直安慰自己,他們只是感情好景用,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布涵叮。 她就那樣靜靜地躺著,像睡著了一般伞插。 火紅的嫁衣襯著肌膚如雪割粮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天媚污,我揣著相機(jī)與錄音舀瓢,去河邊找鬼。 笑死耗美,一個(gè)胖子當(dāng)著我的面吹牛京髓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播商架,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼堰怨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛇摸?” 一聲冷哼從身側(cè)響起备图,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赶袄,沒想到半個(gè)月后揽涮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饿肺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蒋困,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敬辣。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡家破,死狀恐怖颜说,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汰聋,我是刑警寧澤门粪,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站烹困,受9級(jí)特大地震影響玄妈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜髓梅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一拟蜻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枯饿,春花似錦酝锅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蟋字,卻和暖如春稿蹲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹊奖。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工苛聘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忠聚。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓设哗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親两蟀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熬拒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 隨著solidity 0.5.0 nightly build版本的穩(wěn)步推進(jìn),正式版也將在不久的將來與開發(fā)者見...
    黑白灰的綠i閱讀 855評(píng)論 0 0
  • 以太坊不僅是一種加密數(shù)字貨幣,它更是功能完備的智能合約平臺(tái)垫竞,solidity就是用來開發(fā)以太坊上的智能合約的原生開...
    編程狂魔閱讀 1,529評(píng)論 0 1
  • 上一篇:智能合約編程語言 - solidity快速入門(上) solidity區(qū)塊及交易屬性 在介紹區(qū)塊及交易屬性...
    端碗吹水閱讀 1,937評(píng)論 0 3
  • (注:本文是在原文的基礎(chǔ)上澎粟,根據(jù)個(gè)人的理解,修改部分內(nèi)容并添加了一些注釋) 買賣部分代碼未調(diào)試通過 基礎(chǔ)版的代幣合...
    中v中閱讀 2,880評(píng)論 0 2
  • 第一次租房是在2016年欢瞪,大二升大三的暑假活烙,那時(shí)我在優(yōu)衣庫兼職,是我人生中的第一份工作遣鼓,同事多是如我一樣的學(xué)生啸盏。在...
    他樣故事刊閱讀 323評(píng)論 0 9