雖然這篇c++繼承範例鄉民發文沒有被收入到精華區:在c++繼承範例這個話題中,我們另外找到其它相關的精選爆讚文章
在 c++繼承範例產品中有1篇Facebook貼文,粉絲數超過3,460的網紅Taipei Ethereum Meetup,也在其Facebook貼文中提到, 📜 [專欄新文章] 類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做 ✍️ 田少谷 Shao 📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心...
同時也有108部Youtube影片,追蹤數超過6萬的網紅大人的玩具,也在其Youtube影片中提到,跪求有空的朋友 為影片加上字幕(中文即可) 萬分感謝 https://www.youtube.com/timedtext_cs_panel?tab=2&c=UC1FmA48qj1YOYQ5I6j4l6YA 如果覺得我介紹的不錯,歡迎贊助我的開箱影片(Please support my video ...
-
c++繼承範例 在 大人的玩具 Youtube 的精選貼文
2017-12-01 01:09:07跪求有空的朋友
為影片加上字幕(中文即可)
萬分感謝
https://www.youtube.com/timedtext_cs_panel?tab=2&c=UC1FmA48qj1YOYQ5I6j4l6YA
如果覺得我介紹的不錯,歡迎贊助我的開箱影片(Please support my video Channel) PayPal : jkc1974@gmail.com
開箱介紹:Nintendo Switch 遊戲機 ニンテンドースイッチ~ by 大人的玩具
賣場
http://class.ruten.com.tw/user/index00.php?s=18xtoys
FB
https://www.facebook.com/18Xtoys
任天堂Switch(日語:ニンテンドースイッチ,英語:Nintendo Switch)是任天堂出品的電子遊戲機,於2017年3月3日在日本、北美、歐洲和香港發售,同年12月1日在韓國與台灣發售。擁有可拆卸控制器和可分離式主機,遊戲載體使用了專用卡匣。主機處理器使用了NVIDIA客制的Tegra X1系統晶片,這是任天堂首次採用NVIDIA的系統晶片。[2]開發期中的主機於2015年3月17日以「NX」代號首次公布,在2016年10月20日首次於網路影片上公開正式名稱任天堂Switch和其造型。[4]
目錄 [隱藏]
1 硬體
1.1 主機和底座
1.2 手柄
1.3 硬體規格
2 軟體
2.1 系統
2.1.1 任天堂Switch線上服務
2.1.2 任天堂eShop
2.2 遊戲
3 沿革
4 評價
4.1 發售前
4.2 發售後
4.3 商業評論
4.4 銷售成績
5 事件
5.1 正式發表會前
5.1.1 假任天堂Switch惡搞事件
5.2 正式發售前
5.2.1 「任哥吉拉」事件
5.2.2 主機提前洩漏事件
5.2.3 Joy-Con失去與主機本體連接
5.3 正式發售後
5.3.1 卡匣「口感」
5.3.2 左Joy-Con感應不良問題
5.3.3 任天堂對產能致歉
6 法律糾紛
7 參考資料
8 外部連結
硬體
主機和底座
任天堂Switch主機、底座和Joy-Con手柄控制器
任天堂Switch混合了家用主機和便攜式遊戲機的概念,主體為一個類似平板電腦的裝置,採用了JDI生產的6.2英吋的多觸點顯示屏,解析度為1280x720像素;像素密度為236.87ppi。[5][6]內置32GB儲存空間,並支援Micro SD(SDHC、SDXC)儲存卡作為擴充。採用了USB Type-C型介面作為充電介面,可直接插上充電器充電,也可以放入底座內充電;此外該介面也負責主機與底座之間的畫面、聲音的資料傳輸。主機內置了一個主動散熱風扇和導熱管,目的是使處理器不會因為過熱降低效能,其出風口在主機上方。[7]
任天堂Switch的底座(Switch Dock)可以透過HDMI輸出1920x1080像素的畫面;底座還可以為Switch主機充電;底座上還有3個USB介面(2個USB2.0、1個USB3.0),但目前官方沒有給出用途範例;根據一些媒體的測試,用戶可以透過底座的USB介面連線鍵盤等硬體外設。[8]
手柄
任天堂Switch主機(上)與左右分開的Joy-Con控制器(下)
任天堂Switch的遊戲手柄「Joy-Con」是兩個採用了可分離式設計的手柄,可插在主機主體兩側以類似Game Boy Advance的形態進行遊戲,也可從主體上拆下後獨立作為兩個控制器進行雙人遊戲,還可以裝到外設「Joy-Con Grip」上合成一個傳統樣式的手柄控制器。[9][10][11][12]隨主機附贈的「Joy-Con Grip」沒有為Joy-Con手柄充電的功能,而單獨銷售的「Joy-Con Grip」則包含有為手柄充電的功能。[13]左右兩個Joy-Con手柄都內建了體感控制功能,並且還配備了被稱為「HD振動」的振動反饋裝置,可以給予玩家更細膩的反饋。此外,左側的Joy-Con手柄上包括了一個螢幕擷取按鍵,在發售時只能用於螢幕截圖,更新系統4.0.0後新增視訊錄製功能;右側的Joy-Con手柄中內建了讀取amiibo玩偶的NFC晶片和被稱為「IR Camera」的紅外線傳感器。[14][15]值得一提的是Joy-Con手柄是任天堂自FC遊戲機以來首次取消傳統的十字鍵,改為任天堂Game & Watch最初的分離式方向鍵。[16]
任天堂Switch Pro Controller
除主機附帶的Joy-Con外,玩家還可另購任天堂Switch Pro手柄。Pro手柄還是繼續使用傳統的十字鍵,不過相較於Wii U的手柄,它在鍵位上也有一定變化,最明顯的是右搖杆和ABXY按鍵位置對調,向Xbox系列手柄的按鍵布局靠攏。[17][18]該手柄為任天堂Switch專用,無法在其他任天堂家用遊戲機上使用。此外,Pro手柄右搖杆的主機板處還刻有隱藏的文字以感謝玩家。[19]
硬體規格
任天堂Switch的處理器使用了NVIDIA客制的Tegra X1系統晶片及其內建的GeForce顯卡,這是任天堂首次採用NVIDIA的處理器和顯卡。此前任天堂的家用主機從任天堂GameCube到Wii U都採用了IBM的處理器以及ATI和AMD顯卡。[2]根據遊戲媒體的評測,任天堂Switch使用的Tegra X1處理器為20奈米製造工藝,有4核心ARM Cortex-A57架構中央處理器以及4顆ARM Cortex-A53架構處理核心;[20]圖形處理器採用了基於Maxwell微架構的256核心CUDA,圖形處理器會根據主機處於便攜狀態或插入底座的不同情況進行差異化運算,在便攜狀態下運算頻率為307.2MHz,而插入底座後會提升至768MHz到921MHz。[21][22]主機記憶體為4GB LPDDR4。[23]
任天堂Switch主機的內建儲存空間為32GB,可使用microSD進行擴充,最高支援microSDXC標準,最大支援2TB容量;[24]主機在初始系統1.0.0時只能支援到microSDHC標準,發售同日提供的系統2.0.0更新使其可支援microSDXC標準。[25]
任天堂Switch的遊戲載體採用了任天堂掌上遊戲機系列上一直使用的卡匣而非自任天堂GameCube以來家用主機一直使用的光碟;值得一提的是,為了防止嬰幼兒誤吞卡匣,任天堂在生產卡匣時加入了無毒的苦味劑苯甲地那銨。[26]任天堂Switch繼續支援自家的有近場通訊的玩偶Amiibo。[27]任天堂Switch主機本體內建了4310mAh的鋰電池,但電池不可更換;而根據遊戲的不同,主機續航時間從2.5小時至6小時不等,例如玩《薩爾達傳說 曠野之息》電量最多能持續3小時。[28]
軟體
系統
主條目:任天堂Switch系統軟體
作業系統基於FreeBSD。[29]在任天堂Switch的系統框架中,任天堂隱藏了一個紅白機遊戲《高爾夫》,遊戲可以透過Joy-con操控。根據媒體和玩家分析,該彩蛋是為了向已故的前任社長岩田聰致敬,他是《高爾夫》唯一一名程式設計師。[30]此外任天堂Switch不會再支援Wii U和任天堂3DS上的遊戲社群交流網路服務「Miiverse」;而任天堂3DS系列機型上獨特的「擦肩通訊」功能也不會出現在任天堂Switch上。[31][32]
任天堂Switch線上服務
主條目:任天堂Switch線上服務
任天堂Switch採用叫做「Nintendo Switch Online Services」的新網路服務。2017年3月3日發售時為免費服務,計劃於2018年開始進行收費。屆時只有付費用戶可以透過任天堂Switch線上服務進行網路連線遊戲和語音聊天,獲得每月免費Virtual Console遊戲和限定優惠折扣,此外亦有免費用戶也可使用的基礎功能。這種線上服務有點類似於微軟推出的Xbox Live。[33][34]
任天堂eShop
主條目:任天堂eShop
在任天堂eShop所下載的任天堂Switch遊戲將不會綁定主機,而是綁定帳號,放棄了長久以來任天堂將遊戲綁定主機的政策。[35]玩家可任意修改自己的任天堂帳號所在國家或於同一台主機上登陸多個不同國家的任天堂帳號,來方便地購入只在其他國家發行的遊戲,或是選擇在價格最低廉的國家購入遊戲。這一政策在方便玩家的同時,亦被認為會一定程度上影響當地發行商的利益。截至2017年10月,南非與墨西哥等國eShop因有多個遊戲價格較其他國家eShop低廉而受到玩家關注。
遊戲
主條目:任天堂Switch遊戲列表和暢銷任天堂Switch遊戲列表
任天堂Switch並不是Wii U和任天堂3DS的後續機種,所以不會相容任天堂之前推出的Wii U或任天堂3DS上的遊戲,這結束了任天堂自Wii以來的家用主機可以相容上世代主機遊戲的歷史,也是任天堂首次在可攜式遊戲機上停止相容上一世代型號的遊戲。[36]同時任天堂Switch也是任天堂自FC遊戲機以來首個取消遊戲軟體鎖區的家用主機,也是繼任天堂DS後任天堂再次在可攜式遊戲機上沒有鎖區。[37]
第一款確認在製作的任天堂Switch遊戲是史克威爾艾尼克斯的《勇者鬥惡龍XI 追尋逝去的時光》,遊戲在2015年7月28日正式公布,並稱將計劃登陸當時還被稱作NX的任天堂Switch。[38]而任天堂本社第一款確認登陸新主機的遊戲是《薩爾達傳說 曠野之息》,遊戲原先是Wii U平台獨占。[39]在任天堂Switch正式公布後,育碧宣布旗下的《舞力全開2017》將會登陸任天堂Switch。[40]任天堂Switch的首部宣傳片中出現了《上古卷軸V:無界天際》的畫面,貝塞斯達表示很樂於與任天堂展開合作,但當時公司還沒有確認哪款作品會登陸任天堂Switch,直到2017年1月13日的發表會才正式確認該遊戲會在2017年秋季發售,這也是貝塞斯達首次在任天堂硬體平台上製作遊戲。[41][42]而SEGA也確定將在2017年發售開發代號為「Project Sonic 2017」的《音速小子》系列新作也將會登陸任天堂Switch。[43]2017年5月,卡普空宣布《魔物獵人XX》正式登陸任天堂Switch平台。該作可幾乎完整繼承3DS版的存檔。除了任天堂Switch版玩家可面連/網連之外,不同平台玩家也可以透過網連一同合作狩獵。[44][45] -
c++繼承範例 在 鍾日欣 Youtube 的最讚貼文
2017-09-01 16:50:29我是JC老師
電腦相關課程授課超過6000小時的一位 Revit 課程講師
由於實在太多同學向JC老師反映,希望可以有線上課程學習,所以就決定錄製一系列的 Revit 線上影片教學
而且不加密、不設限、不販售,就是純分享,希望可以幫助到有需要的朋友們
如果這部 3ds Max 教學影片對你有幫助的話,請幫我按個讚,給我點鼓勵,也多分享給需要的朋友們喔~
---------------------------------------------------------------------------------------------------------
複製元素
● Revit Architecture 提供了數種複製一個或多個所選元素的方法。
● 選取一個元素,按 Ctrl 鍵的同時,拖曳該元素以複製它。
● 藉由按 Ctrl+C 和 Ctrl+V,使用剪貼簿來複製並貼上元素。
● 建立類似的
◆ 可放置與選取的元素相同類型的元素。
◆ 選取單一物件
◆ 右鍵然後按一下「建立類似的」,或「修改 | 元素」頁籤 /「建立」面板 / (建立類似的)
◆ 在繪圖區域中按一下,將新建立的例證放置在所需位置。依需要多次重複此操作。
◆ 使用「建立類似的」時,每一個新元素將繼承在所選取元素的族群編輯器中定義的族群例證參數。
● 使用「複製」工具可複製元素並將其立即放置。
◆ 「複製」工具可複製一個或多個選取的元素,並可讓您將複本立即放置在同一視圖圖面中。
◆ 選取物件
◆ 「修改 | 元素」頁籤 / 「修改」面板 / (複製)。
◆ 先點基準點,再點目標點
◆ 若要放置多個複本,請在選項列上選取「多個」。
● 複製到剪貼簿
◆ 選取物件
◆ 「修改 元素」頁籤 /「剪貼簿」面板 / (複製)。
● 從剪貼簿貼上
◆ 將元素複製到剪貼簿
◆ 將游標置於要貼上元素的視圖中。
◆ 「修改」頁籤 /「剪貼簿」面板/「貼上」下拉式清單 / (從剪貼簿貼上)。
◆ 按一下將預覽影像放置在所需位置。
● 貼上對齊的元素
◆ 將元素複製到剪貼簿
◆ 「修改」頁籤 /「剪貼簿」面板 /「貼上」下拉式清單
★ 與選取的圖層對齊:如果複製所有的模型元素,可以將它們貼上到一個或多個圖層。在顯示的對話方塊中,依名稱選擇樓層。若要選取多個名稱,請在選取名稱時按 Ctrl。
★ 與選取的視圖對齊:如果複製視圖特有的元素 (如標註) 或模型和視圖特有的元素,可以將它們貼上到相似類型的視圖中。
★ 與目前視圖對齊:將元素貼上到目前視圖。例如,可以將元素從平面視圖貼到圖說視圖。該視圖必須不同於切割或複製元素所在的視圖。
★ 與同一位置對齊:將元素貼上到與所切割或所複製元素相同的位置。此選項適合用於在工作集或設計選項之間貼上元素。此外,還可以用來在具有共用座標的兩個檔案之間進行貼上操作。
★ 與點選的圖層對齊:將元素貼上到立面視圖。必須在立面視圖中才能使用此工具,因為此工具需要選取要貼上元素的樓層線。請勿使用專案瀏覽器點選樓層。
---------------------------------------------------------------------------------------------------------
Revit 2016 線上教學影片目錄:http://bit.ly/2vR6fgW
Revit 2016 線上教學影片範例下載:http://bit.ly/2vR0b7X
3ds Max 2015 線上教學影片目錄:http://bitly.com/2dUGqn3
AutoCAD 2015 2D 線上教學影片目錄:http://bitly.com/2dUGm6Y
TQC AutoCAD 2008 2D 線上教學影片目錄:http://bitly.com/2dUGQtB
JC-Design網站:http://jc-d.net/
JC-Design粉絲團:https://www.facebook.com/jcdesigntw/
JC-Design LINE ID:@umd7274k
JC電子信箱:[email protected] -
c++繼承範例 在 鍾日欣 Youtube 的最佳解答
2017-09-01 16:50:07我是JC老師
電腦相關課程授課超過6000小時的一位 Revit 課程講師
由於實在太多同學向JC老師反映,希望可以有線上課程學習,所以就決定錄製一系列的 Revit 線上影片教學
而且不加密、不設限、不販售,就是純分享,希望可以幫助到有需要的朋友們
如果這部 3ds Max 教學影片對你有幫助的話,請幫我按個讚,給我點鼓勵,也多分享給需要的朋友們喔~
---------------------------------------------------------------------------------------------------------
複製元素
● Revit Architecture 提供了數種複製一個或多個所選元素的方法。
● 選取一個元素,按 Ctrl 鍵的同時,拖曳該元素以複製它。
● 藉由按 Ctrl+C 和 Ctrl+V,使用剪貼簿來複製並貼上元素。
● 建立類似的
◆ 可放置與選取的元素相同類型的元素。
◆ 選取單一物件
◆ 右鍵然後按一下「建立類似的」,或「修改 | 元素」頁籤 /「建立」面板 / (建立類似的)
◆ 在繪圖區域中按一下,將新建立的例證放置在所需位置。依需要多次重複此操作。
◆ 使用「建立類似的」時,每一個新元素將繼承在所選取元素的族群編輯器中定義的族群例證參數。
● 使用「複製」工具可複製元素並將其立即放置。
◆ 「複製」工具可複製一個或多個選取的元素,並可讓您將複本立即放置在同一視圖圖面中。
◆ 選取物件
◆ 「修改 | 元素」頁籤 / 「修改」面板 / (複製)。
◆ 先點基準點,再點目標點
◆ 若要放置多個複本,請在選項列上選取「多個」。
● 複製到剪貼簿
◆ 選取物件
◆ 「修改 元素」頁籤 /「剪貼簿」面板 / (複製)。
● 從剪貼簿貼上
◆ 將元素複製到剪貼簿
◆ 將游標置於要貼上元素的視圖中。
◆ 「修改」頁籤 /「剪貼簿」面板/「貼上」下拉式清單 / (從剪貼簿貼上)。
◆ 按一下將預覽影像放置在所需位置。
● 貼上對齊的元素
◆ 將元素複製到剪貼簿
◆ 「修改」頁籤 /「剪貼簿」面板 /「貼上」下拉式清單
★ 與選取的圖層對齊:如果複製所有的模型元素,可以將它們貼上到一個或多個圖層。在顯示的對話方塊中,依名稱選擇樓層。若要選取多個名稱,請在選取名稱時按 Ctrl。
★ 與選取的視圖對齊:如果複製視圖特有的元素 (如標註) 或模型和視圖特有的元素,可以將它們貼上到相似類型的視圖中。
★ 與目前視圖對齊:將元素貼上到目前視圖。例如,可以將元素從平面視圖貼到圖說視圖。該視圖必須不同於切割或複製元素所在的視圖。
★ 與同一位置對齊:將元素貼上到與所切割或所複製元素相同的位置。此選項適合用於在工作集或設計選項之間貼上元素。此外,還可以用來在具有共用座標的兩個檔案之間進行貼上操作。
★ 與點選的圖層對齊:將元素貼上到立面視圖。必須在立面視圖中才能使用此工具,因為此工具需要選取要貼上元素的樓層線。請勿使用專案瀏覽器點選樓層。
---------------------------------------------------------------------------------------------------------
Revit 2016 線上教學影片目錄:http://bit.ly/2vR6fgW
Revit 2016 線上教學影片範例下載:http://bit.ly/2vR0b7X
3ds Max 2015 線上教學影片目錄:http://bitly.com/2dUGqn3
AutoCAD 2015 2D 線上教學影片目錄:http://bitly.com/2dUGm6Y
TQC AutoCAD 2008 2D 線上教學影片目錄:http://bitly.com/2dUGQtB
JC-Design網站:http://jc-d.net/
JC-Design粉絲團:https://www.facebook.com/jcdesigntw/
JC-Design LINE ID:@umd7274k
JC電子信箱:[email protected]
c++繼承範例 在 Taipei Ethereum Meetup Facebook 的最佳貼文
📜 [專欄新文章] 類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做
✍️ 田少谷 Shao
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
有鑒於個人近期關注的 Uniswap 及 Curve 皆用 Vyper 實作,索性瀏覽了官方文件並嘗試一些開發工具,希望此文能減少一些讀者初嘗 Vyper 會遇到的麻煩!
Vyper and Solidity
Outline
一. Vyper 極簡介二. 與 Solidity 語法差異三. 開發、開發環境設置 1. 語法高亮 2. 本地 Vyper compiler 安裝 3. 使用 Truffle 操作 ERC20 - 安裝 Truffle - 發幣 - 寫個簡易賣幣合約四. 已知 Remix 問題 五. 結語
一. Vyper 極簡介
Vyper 是除 Solidity 外,以太坊上的另一智能合約 (Smart contract) 語言。其語法和 Python 相近,但畢竟也是寫合約的語言,邏輯差異不大,所以若熟悉 Solidity 應該不難理解用 Vyper 寫出的合約!
Vyper 主要被設計和 Solidity 的區別是安全性及可讀性,這部分會在下一段落及後方的實作中舉例說明。
二. 與 Solidity 語法差異
Vyper 與 Solidity 的差異有許多,在本段只就個人認為感受較深的三點進行說明,其他差異只進行翻譯,有興趣的讀者可以到官方文件詳細了解:https://vyper.readthedocs.io/en/latest/index.html
1. 沒有 modifier
Solidity 常見的 onlyOwner() modifier; 由於 gist 沒有 Solidity 的語法高亮,故截圖
在 Vyper 中單純用 assert 及 assert_modifiable 來進行條件檢查,兩者差別為若要檢查函數執行後的返還值,要用後者,如下圖:
Vyper 寫法
2. 沒有 Class inheritance 繼承
繼承是物件導向程式設計 (OOP) 的核心概念,但各種繼承關係有時候確實很複雜。Vyper 沒有繼承,這無疑大幅地增加了程式可讀性及安全性,以及降低審計程式碼的難度。在此提供一個例子供不熟悉 OOP 複雜之處的讀者有個概念:
source: https://consensys.github.io/smart-contract-best-practices/recommendations/#multiple-inheritance-caution
在上例中,contract A 的 fee 值 (因繼承自 contract B 和 C,故有 fee 一值) 是 5、a 值也是 5 (因繼承自 contract Final,故有 a 一值)。原因是 A 先繼承 B 再繼承 C,因此 contract A 中的 setFee() 是使用了 contract C 的 setFee(),而 a 值是由於 C(5),這代表 contract C 的 constructor (舊版本中即 function C(),函式名稱同 contract 名稱) 被傳入的值為 5。
稍微延伸一下以上概念,將 contract A 改成:contract A is C, B。如此一來,a 值還有 fee 值都會是 3,因為這次 A 先繼承 C 再繼承 B,因此最終吃到的值是 contract B 的。
以上就是 OOP 繼承的複雜之處的簡單範例說明,應該能稍微感受到爲什麼除去繼承後會大幅提高可讀性及安全性,畢竟即使是熟悉 OOP 的人有時頭腦一混亂也會開始懷疑自己寫的程式碼繼承結構是否正確 …
3. 沒有 dynamic array 動態陣列
這應該是目前 Vyper 設計中爭議最大的部分。沒有動態陣列代表在宣告陣列時需要宣告其長度,也就是說 Solidity 中的寫法 uint[], bool[] 等等,這些是不會出現在 Vyper 的。在 Vyper 中只能出現諸如:
# Vyper 的變數宣告方式為 變數名稱: 存取範圍(變數型態(若為陣列給長度))
values: uint256[10]participants: public(address[20])
可以看到上方的 uint256 及 address 兩陣列皆需要宣告長度,不能不宣告而使其動態地配置空間。
沒有動態陣列固然可以確保執行運算的範圍、次數,但一來動態陣列真的很方便、二來在 Solidity 有此功能而 Vyper 卻沒有的情況下可能會造成麻煩,詳見此一討論串:點我。
4. 沒有 inline assembly,程式碼中不會有組合語言
5. 沒有 function overloading,函式不會因傳入的參數數目不同而結果不同
6. 沒有 operator overloading,運算符號不會有不同於預設的自定義功能
7. 沒有無限迴圈,可免於 gas limit attack
8. 十進位定點數 decimal fixed point 而非二進位 (binary) 定點數,詳見:點我
三. 開發、開發環境設置
結論先講
開發 Vyper 的最佳姿勢目前個人認為是在本地裝上 Vyper compiler、用 Truffle 部署,並在撰寫時將檔名後加上 .py 就能有 Python 的語法高亮👌
1. 語法高亮 (syntax highlighting)
有語法高亮絕對是舒服地寫程式的第一步。
Remix 有 Vyper 的語法高亮,但一來個人目前不推薦使用 Remix 來撰寫 Vyper,原因詳見下方 4. 已知 Remix 問題;二來 Remix 的語法高亮其實也沒有很清楚,因此個人推薦:在本地開發,將檔名後加上 .py 就會有 Python 的語法高亮。
2. 本地 Vyper compiler 安裝
照官方說明使用 Python 的虛擬環境 virtualenv:
source: https://vyper.readthedocs.io/en/latest/installing-vyper.html#installing-vyper
簡單兩點提醒:
如果中間那行報錯但確實已經有 Python,則可能是版本問題。依照自己電腦上的版本改成相應的即可,ex: python3.6 改成 python3
進入虛擬環境後(檔案路徑前方應有 vyper-venv 的提示),使用此指令: vyper {檔案名稱}.vy,即可編譯 .vy 檔;使用完畢後輸入 deactivate 即可退出
3. 使用 Truffle 操作 ERC20
安裝 Truffle
Truffle 雖有冗餘的 migration 但也別無他法,畢竟 Remix 目前仍不完善 :(
下載流程可以照官方文件,使用 vyper-example:
source: https://github.com/truffle-box/vyper-example-box
由於我們會接上測試網 Ropsten,因此還要下載 truffle-hdwallet-provider:
source: https://github.com/trufflesuite/truffle-hdwallet-provider
接者就可以開始使用 Vyper 寫合約了!
發幣
由於 Vyper 的官方文件中已經有許多優質範例,因此本文希望來點不一樣但大家卻又很熟悉的…以 ERC20 為例(這千篇一律的主題xD):
用 Curve 的 ERC20 程式碼為範本,發一個幣(又要發…)
寫一個簡易賣幣合約
選擇這個主題一方面畢竟 ERC20 是以太坊的最大宗應用之一,二來有興趣的讀者可以透過讀 ERC20 的程式碼來熟悉 Vyper,並在看過本文的流程後對於用 Vyper+Truffle 來操作 ERC20 有完整的概念!
好的,首先複製一份 Curve 的 ERC20 程式碼(看到就順手拿來用),並複製到 Truffle 所在路徑的 contracts 資料夾中:https://github.com/curvefi/curve-contract/blob/pool_compound/vyper/ERC20.vy
由於第一點希望著重在跑一次流程,因此不改動合約的程式碼。
將 ERC20.vy 複製到 contracts 資料夾中後,到 migrations 資料夾開啟 2_deploy_contracts.js,首先將 require() 中的參數改為 ERC20.vy 的檔名 ERC20,再來依照自己喜好決定幣的名稱、代號、小數點位數及發行總量,輸入於 deployer.deploy() 中。
接著,為了和測試網 Ropsten 互動,需要將以下程式碼寫入 truffle-config.js。
第二行的 privateKeys 是帳號的私鑰。以下實作需要兩個帳號來操作,因此請從錢包匯入兩組私鑰(並非助憶詞)。
在第 13 行中 HDWalletProvider 此函式的第三個參數代表要用第幾個帳號最為預設帳號(部署合約等),第四個函數代表總共匯入幾組帳號。而第二個參數則是需要至 Infura 申請一個 project 來得到串接 Ropsten 的連結。這兩步驟並非本文重點,因此不詳細解說步驟,Google 搜尋關鍵字應該就會找到方法!
接著,就可以輸入以下指令來將代幣發佈到 Ropsten:
truffle deploy --network ropsten
有進入虛擬環境才可以編譯 .vy 檔,若忘記就會收到如下的錯誤訊息:
記得打開虛擬環境才能編譯 .vy 檔
成功後就可以在 contract address 中看到代幣發佈的位置,加入到 Metamask 中就可以看到。本文的例子是維尼代幣 Winnie the Coin, WTC ;)
contract address 便是 ERC20 的所在
Winnie the Coin, WTC
好了,到此測試網上又多了一個測試用的垃圾廢幣。
寫個簡易賣幣合約
賣幣合約中我想要簡單有兩個功能就好:付錢買幣 、結束銷售,以下就是程式碼。買幣的部分就不寫太詳細,固定價格為 0.01 Ether 可以買 500 代幣。
簡單說明幾點:
Solidity 的 constructor() 在 Vyper 中為 Python 風的 __init__():
函式的屬性(public, private, payable 等等)放在函式上方,與 Python 的修飾器位置相同
總之寫法跟 Python 很像,次方也一樣是用兩次乘法代表:**
變數前加上 self 代表是當前合約的變數/全域變數,因此非常容易與函式中的變數/區域變數做區隔
由於已經在第一行匯入了 ERC20 那份合約,因此透過將地址傳入合約當參數,就可以呼叫在該地址的合約:ERC20(self.tokenAddress) 。並且,可以將部署的合約存成一個變數 erc20 較方便
寫完合約後一樣要更改 migrations 資料夾中的 2_deploy_contracts.js 如下,將代幣所在的地址作為參數輸入。
由於先前已經部署過一次了,因此要重置才能再部署第二次,輸入以下指令:
truffle deploy --reset --network ropsten
部署成功之後就要來試著買幣啦!輸入以下來進入 console:
truffle console --network ropsten
成功進入後應該會看到 truffle(ropsten)> 的字樣。接著,首先取得部署的兩合約,並查看是否有返回合約資訊:
# ERC20 及 SellToken 是先前在 2_deploy_contracts.js 中的變數名稱,代表被部署的合約
let instance1 = await ERC20.deployed()instance1 # 印出 instance1 的資訊
let instance2 = await SellToken.deployed()instance2 # 印出 instance2 的資訊
再來,為了讓 SellToken 可以賣幣,要先用 ERC20 的合約匯幣到 SellToken 的合約。因此,輸入以下指令:
instance1.transfer(instance2.address, 10000)
# 這裡數字只要設為 > 500 就可以
接著,我們要利用第二個帳號去買幣(第一個帳號為預設帳號,因此就是代幣擁有者)。將帳號的資訊存入變數 accounts 中,再指定送出交易的帳號是第二個帳號。由於我個人匯入私鑰的順序是將第一個帳號存在 truffle-config.js 的 privateKeys[0]、第二個帳號存在 privateKeys[1],因此第二個帳號的地址就會在 accounts[1] 的位置:
let accounts = await web3.eth.getAccounts()
instance2.buyToken({from: accounts[1], value: 10000000000000000})
# value 為 10^16 是因為在 SellToken 的 buyToken 函式中買一次要 0.01 Ether, 即為 10^16 wei
然後應該就會在自己的第二個帳號中看到匯入的幣了~
最後,由於合約中結束銷售就是一個自殺 selfdestruct 函式,因此可以呼叫看看,第一個帳戶錢包中的錢應該會增加,因為第二個帳戶有付款買幣;並且,可以到 Ropsten 上瀏覽,應該能看到相關提示:
中間 contract 的右上角有 Self Destruct 的樣式
四. 已知 Remix 問題
Remix 目前有兩個版本,只有新版有 Vyper 的編譯器。在此整理目前遇到的問題,如果有人也遇到可以對照一下本處,可以省去很多自我懷疑xD
不會報錯
Remix 的編譯結果有時會是錯的、和本地端編譯出來的結果不同
舉上方的 SellToken 合約為例,將其複製到 Remix 中使用左邊的 Remote Compiler 有錯,但又不報錯 q_q (ERC20 的合約有在同檔案目錄)
左方有紅色三角形,代表編譯失敗,但沒有報錯訊息可以看…
getter function 竟然要花錢
用 Solidity 寫的合約,查詢 public 變數的值應該是不用消耗 gas 的,但不知何故查詢 Vyper 寫的合約的 public 變數卻要消耗 gas,如下圖…
可以看到中下方有 22026 gas 的消耗
Local compiler 無法使用
圖中的 Local Compiler 此選項,個人雖照官方文件執行 vyper-serve 但卻失敗,因此若有讀者成功希望能留個言不吝分享!
五. 結語
Vyper 作為一個比 Solidity 更新的合約語言,在寫程式碼的方面沒什麼問題,但相關的開發工具、學習資源等都遠不及 Solidity。
Vyper 主打的兩個特色:可讀性的部分相信看完上面的讀者應該已經有些感覺;安全性…小白如作者我倒是沒有感受到顯著的不同。況且 Solidity 已經發展許久,很多錯誤的寫法、知名的安全漏洞大家應該也很熟悉了,還有 Openzeppelin 提供安全合約寫法的範本,因此有待以後高人解說安全性是否真的是 Vyper 較好。
有興趣者可以查看 Vyper 的安全報告:點我,大意是目前 Vyper 的編譯器仍有許多問題待改進! (感謝 Chih-Cheng Liang 的提供)
本文對 Vyper 的介紹及其與 Solidity 的差異只講了個大概,欲知更詳細的介紹還是要麻煩讀者前往官方文件了:https://vyper.readthedocs.io/en/latest/index.html
最後,如果本文有任何錯誤,請不吝提出,我會盡快做修正;而如果我的文章有幫助到你,可以看看我的其他文章,歡迎一起交流 :)
田少谷 Shao - Medium
類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌