雖然這篇c++變數名稱鄉民發文沒有被收入到精華區:在c++變數名稱這個話題中,我們另外找到其它相關的精選爆讚文章
在 c++變數名稱產品中有5篇Facebook貼文,粉絲數超過1萬的網紅91 敏捷開發之路,也在其Facebook貼文中提到, 其實很多團隊裡面有些該被時代淘汰的開發/命名/排版規範,或是該規範有其適用的 context,現在產品開發可能已經不具備該 context 了。 但團隊中的一些老鳥,可能因為沒有去確認該規範所對應的 context ,或是不明究理的一脈傳承下來的限制(就跟猴子拿香蕉就被噴水,之後的猴子都不敢拿香蕉...
同時也有4部Youtube影片,追蹤數超過68萬的網紅Dream Chef Home 夢幻廚房在我家,也在其Youtube影片中提到,★記得要訂閱我喔!☆訂閱Vivian每週看新片,請記得開啟YouTube🔔通知! 🌸食譜: 這次來玩無麩質「米鬆餅」。沒錯!100%用生米做的呦!超好呲😋 把液體材料用優格取代,能造成更蓬鬆濕潤的組織。 但因為隨便修改其中的材料,即便是一點點都會造成結果的不同,所以請大家先按照我的配方做過,想要...
「c++變數名稱」的推薦目錄
c++變數名稱 在 工具王 阿璋 Instagram 的最佳解答
2021-04-04 20:32:18
【#程式教學】打程式「安捏母湯」啦! ☑️如何保持良好的 Coding Style? 不論在各種程式語言中,保持良好的 Coding Style 都是很重要的😌😌😌 就別說酒醉起來認不得自己的程式碼有多糗了🤢想看糗事,請追蹤上一篇貼文:Code 是什麼?Coding Style 是什麼?...
-
c++變數名稱 在 Dream Chef Home 夢幻廚房在我家 Youtube 的最佳解答
2021-05-17 19:00:16★記得要訂閱我喔!☆訂閱Vivian每週看新片,請記得開啟YouTube🔔通知!
🌸食譜:
這次來玩無麩質「米鬆餅」。沒錯!100%用生米做的呦!超好呲😋
把液體材料用優格取代,能造成更蓬鬆濕潤的組織。
但因為隨便修改其中的材料,即便是一點點都會造成結果的不同,所以請大家先按照我的配方做過,想要更改份量或食材,就等成功後再自己慢慢實驗了。
考量到很多新手朋友對於掌控米糊發酵的狀態有困難,所以這個鬆餅是用無鋁泡打粉膨發的,可以增加食譜的成功度,新手也能輕鬆掌握。
用相同配方米糊來製作雞蛋糕也可以,如果有小V機器的朋友,一定要玩玩看這個配方,真的粉好吃!
一起動手來做米鬆餅🥞
📌詳細文字食譜🔗
https://reurl.cc/v5rnX1
📌影片小撇步
{米麵糊重點整理}
👉只要打到無一點米粒殘留(細緻)、溫度不超過42度C基本上隨便你怎麼打。(石磨也可以)
我影片必須考量到所有人有可能遇到的狀況,所以會比較謹慎,有停機、刮杯等動作。
👉溫度只是為了加快酵母發酵、幫助發酵,酵母喜歡接近人體的溫度。
如果沒有這樣的溫度就算在冰箱低溫冷藏發酵也可以,基本上就是想辦法讓米糊發酵至接近2倍(1.8、1.9倍)
👉米糊容易表面乾燥,所以任何靜置時,盡可能保濕、噴水霧。
👉基本上有點溫度都能感覺麵糊是活的在呼吸(仔細看),如果沒動靜,酵母應該死了。
我用即溶速發酵母,要換任何其他天然酵母皆可,但請重新換算用量,網路很多分享。
👉不要問能做多少片,因為跟每片大小有關,也可以一份只做一片。
{請諒解}
烘焙料理是一門科學,是條實驗之路!即便光是一樣食材的變化,好比水多加10少加10?結果就大不相同了,何況食材那麼多種,變數就更大了!我無法把每種變數都做過,所以所有改配方的問題一率不回答。
希望有興趣食譜的朋友先試一回這個版本是否能在家也成功複製出來?成功後再自己實驗修改配方,機器工具品牌很多,我也無法每台都試,變化版請自己實驗囉!
{保存}
請盡量新鮮吃現做現吃啊!沒吃完就密封好放冰箱冷凍可放一個月不是問題,想吃回蒸回烤即可。
👩🏻🍳 食材 Recipes(直徑10cm約6片)
米180克(泡水後240克)
優格160克(牛奶或優格皆可)
楓糖漿或蜂蜜40克(或砂糖24克+清水16克)
檸檬汁3克
鹽1克
冷壓椰子油40克(奶油或液態食用油也可以)
無鋁泡打粉12克
✅檸檬汁能綜合掉泡打粉的味道建議不要省略
☘️料理名稱&做法不一定正統,食譜純粹以個人經驗改良分享 ,請多包涵指教。
🌹About Dream Chef Home 夢幻廚房在我家🌹
❤️合作事宜請聯絡Email ↓ dreamchefhome@gmail.com
微博🔗 https://bit.ly/3iTm3Wu
Facebook🔗 https://goo.gl/tM5wCF
Instagram🔗 https://goo.gl/ekbJa3
團購FB私密社團 ➩ https://pse.is/FGESW
完整的食譜影音教學頻道🔗 https://goo.gl/wD27iV
👉我的書這裡購買:https://goo.gl/dGZkFS
💗夢幻廚房精選好物賣場連結底加▶️ https://bit.ly/2VAk3Zd
⚠️ This video is no sponsor ❌
#夢幻廚房在我家 #生米鬆餅 #米鬆餅 #鬆餅 -
c++變數名稱 在 Dream Chef Home 夢幻廚房在我家 Youtube 的最讚貼文
2021-04-20 19:00:16★記得要訂閱我喔!☆訂閱Vivian每週看新片,請記得開啟YouTube🔔通知!
🌸食譜:
無麩質生米蛋糕🎂來囉!
這次分享口感相當濕潤,口感接近海綿蛋糕體的100%米蛋糕,無麩質純米做蛋糕的第一個重點ㄧ定要選吃飯的白米,在來米不適合,我影片用越光米,也可以使用壽司米、珍珠米這類水份充足,口感Q彈的粳米類。
米糊一定要打到無一點米粒殘留細緻的狀態,然後溫度不可超過45度C(因為粉漿被熟化會變硬,過度黏稠)基本上就是打細,要像傳統用石磨我也沒意見😆
用普通果汁機難打到完全細緻無米粒殘留的狀態,所以建議要用破壁型調理機,才能打到完全無米粒殘留的狀態。
如果份量是加倍打,通常破壁機直接連續打1:30秒就可以很細緻,不需中途停機刮杯的動作,因為量大不會有食材噴濺到杯邊的問題!
👉影片相關的機器、小工具等,不定期優惠團購請至連結🔗 https://bit.ly/2VAk3Zd
{請諒解}
烘焙料理是一門科學,是條實驗之路!即便光是一樣食材的變化,好比水多加10少加10?結果就大不相同了,何況食材那麼多種,變數就更大了!我無法把每種變數都做過,所以所有改配方的問題一率不回答。
希望有興趣食譜的朋友先試一回這個版本是否能在家也成功複製出來?成功後再自己實驗修改配方,機器工具品牌很多,我也無法每台都試,變化版請自己實驗囉!
{保存}
請盡量新鮮吃現做現吃啊!放拉鍊袋常溫2-3天沒問題,沒吃完就密封好放冰箱冷凍,可放一個月不是問題,想吃回蒸回烤即可。
📌詳細文字食譜🔗
https://reurl.cc/zbREZp
📌影片小撇步
1.因為膨發必須靠泡打粉跟小蘇打粉,不加無法膨發成蛋糕的口感。檸檬汁能中和小蘇打的味道,建議要加。
2.此蛋糕體內部濕潤,放常溫下2天都還很濕潤,但無防腐劑建議儘早食用完畢。
3.此蛋糕體加上鮮奶油口感更好,可以錶花製作成生日蛋糕。
4.豆漿也可以改成牛奶。
{米麵糊重點整理}
👉只要打到無一點米粒殘留(細緻)、溫度不超過42度C基本上隨便你怎麼打。(石磨也可以)
我影片必須考量到所有人有可能遇到的狀況,所以會比較謹慎,有停機、刮杯等動作。
👉米糊容易表面乾燥,所以任何靜置時,盡可能保濕、噴水霧。
👩🏻🍳 食材 Recipes
米150克(泡水後約200g)
杏仁堅果40克
豆漿110克
楓糖漿或蜂蜜80克
檸檬汁2小匙
自製香草精數滴
鹽2克
冷壓酪梨油(液態油奶油皆可)80克
無鋁泡打粉8克
食用小蘇打粉5克
✅使用模具:圓形蛋糕模直徑12.7Cm活底可拆式
☘️料理名稱&做法不一定正統,食譜純粹以個人經驗改良分享 ,請多包涵指教。
🌹About Dream Chef Home 夢幻廚房在我家🌹
❤️合作事宜請聯絡Email ↓ dreamchefhome@gmail.com
微博🔗 https://bit.ly/3iTm3Wu
Facebook🔗 https://goo.gl/tM5wCF
Instagram🔗 https://goo.gl/ekbJa3
團購FB私密社團 ➩ https://pse.is/FGESW
完整的食譜影音教學頻道🔗 https://goo.gl/wD27iV
👉我的書這裡購買:https://goo.gl/dGZkFS
💗夢幻廚房精選好物賣場連結底加▶️ https://bit.ly/2VAk3Zd
⚠️ This video is no sponsor ❌
#夢幻廚房在我家 #生米蛋糕 #蛋糕 # -
c++變數名稱 在 數學老師張旭 Youtube 的精選貼文
2020-07-22 10:30:50【摘要】
本影片主要推導 Cayley-Hamilton 定理,並講解幾個 Cayley-Hamilton 的應用,後半段講解極小多項式的觀念,並利用極小多項式推測相似矩陣的 Jordan form
【加入會員】
歡迎加入張旭老師頻道會員
付費定閱支持張旭老師,讓張旭老師能夠拍更多的教學影片
https://www.youtube.com/channel/UCxBv4eDVLoj5XlRKM4iWj9g/join
【會員等級說明】
博士等級:75 元 / 月
- 支持我們拍攝更多教學影片
- 可在 YT 影片留言處或聊天室使用專屬貼圖
- 你的 YT 名稱前面會有專屬會員徽章
- 可觀看會員專屬影片 (張旭老師真實人生挑戰、許願池影片)
- 可加入張旭老師 YT 會員專屬 DC 群
碩士等級:300 元 / 月
- 享有博士等級所有福利
- 每個月可問 6 題高中或大學的數學問題 (沒問完可累積)
學士等級:750 元 / 月
- 享有博士等級所有福利
- 每個月可問 15 題高中或大學的數學問題 (沒問完可累積)
- 可許願希望我們拍攝講解的主題 (高中、大學數學)
- 可免費參加張旭老師線上考衝班 (名額不可轉讓)
家長會等級:1600 元 / 月
- 享有博士等級所有福利
- 沒有解題服務,如需要,得另外購入點數換取服務
- 可許願希望我們拍攝講解的主題 (高中、大學數學)
- 可免費參加張旭老師線上考衝班 (名額可轉讓)
- 可參與頻道經營方案討論
- 可免費獲得張旭老師實體產品
- 可以優惠價報名參加張旭老師所舉辦之活動
股東會等級:3200 元 / 月
- 享有家長會等級所有福利
- 一樣沒有解題服務,如需要,得另外購入點數換取服務
- 本頻道要募資時擁有優先入股權
- 可加入張旭老師商業結盟
- 可參加商業結盟餐會
- 繳滿六個月成為終生會員,之後可解除自動匯款
- 終生會員只需要餐會費用即可持續參加餐會
【勘誤】
無,有任何錯誤歡迎留言告知
【習題】
無
【講義】
無
【附註】
本系列影片僅限 YouTube 會員優先觀看
非會員僅開放「單數集」影片
若想看到所有許願池影片
請加入數學老師張旭 YouTube 會員
加入會員連結 👉 https://reurl.cc/Kj3x7m
【張旭的話】
你好,我是張旭老師
這是我為本頻道會員所專門拍攝的許願池影片
如果你喜歡我的教學影片
歡迎訂閱我的頻道🔔,按讚我的影片👍
並幫我分享給更多正在學大學數學的同學們,謝謝
【學習地圖】
EP01:向量微積分重點整理 (https://youtu.be/x9Z23o_Z5sQ)
EP02:泰勒展開式說明與應用 (https://youtu.be/SByv7fMtMTY)
EP03:級數審斂法統整與習題 (https://youtu.be/qXCdZF8CV7o)
EP04:積分技巧統整 (https://youtu.be/Ioxd9eh6ogE)
EP05:極座標統整與應用 (https://youtu.be/ksy3siNDzH0)
EP06:極限嚴格定義題型 + 讀書方法分享 (https://youtu.be/9ItI09GTtNQ)
EP07:常見的一階微分方程題型及解法 (https://youtu.be/I8CJhA6COjk)
EP08:重製中
EP09:反函數定理與隱函數定理 (https://youtu.be/9CPpcIVLz7c)
EP10:多變數求極值與 Lagrange 乘子法 (https://youtu.be/XsOmQOTzdSA)
EP11:Laplace 轉換 (https://youtu.be/GZRWgcY5i6Y)
EP12:Fourier 級數與 Fourier 轉換 (https://youtu.be/85q-2nInw7Y)
EP13:換變數定理與 Jacobian 行列式 (https://youtu.be/7z4ad1I0b7o)
EP14:Cayley-Hamilton 定理 & 極小多項式 👈 目前在這裡
EP15:極限、微分和積分次序交換的條件 (https://youtu.be/QRkGLK7Iw4c)
EP16:機率密度函數 (上) (https://youtu.be/PR1NSAOP_Z0)
EP17:機率密度函數 (下) (https://youtu.be/tDQ3o8uQ_Ks)
持續更新中...
【版權宣告】
本影片版權為張旭 (張舜為) 老師所有
嚴禁用於任何商業用途⛔
如果有學校老師在課堂使用我的影片的話
請透過以下聯絡方式通知我讓我知道,謝謝
【張旭老師其他頻道或社群平台】
FB:https://www.facebook.com/changhsu.math
IG:https://www.instagram.com/changhsu.math
Twitch:https://www.twitch.tv/changhsu_math
Bilibili:https://space.bilibili.com/521685904
【其他贊助管道】
歐付寶:https://payment.opay.tw/Broadcaster/Donate/E1FDE508D6051EA8425A8483ED27DB5F (台灣境內用這個)
綠界:https://p.ecpay.com.tw/B3A1E (台灣境外用這個)
#克萊漢彌爾頓定理 #極小多項式 #喬登型式
c++變數名稱 在 91 敏捷開發之路 Facebook 的最佳貼文
其實很多團隊裡面有些該被時代淘汰的開發/命名/排版規範,或是該規範有其適用的 context,現在產品開發可能已經不具備該 context 了。
但團隊中的一些老鳥,可能因為沒有去確認該規範所對應的 context ,或是不明究理的一脈傳承下來的限制(就跟猴子拿香蕉就被噴水,之後的猴子都不敢拿香蕉,一拿香蕉就會被其他猴子圍毆),也可能是因為「習慣」了不想改,導致團隊開發生產力低落,又得不到對應的好處。
一個明顯的例子,就是匈牙利命名法,在靜態型別語言 + IDE 輔助之下,已經不需要把型別掛在變數名稱或方法名稱上。
另一個則是禁用 C# 裡面的 var,其實工具也都支援一鍵轉換了,當你詢問團隊成員為什麼不能用時,他們的回答是:「我也不知道,就不能用。」這時就會知道這個團隊存在著這樣的根本問題。
當然,還有那種 Data Class 身上不能有方法,或是 interface 自己是個 folder/namespace 的情況。
很多人寫程式真的是都是用背的,沒去了解背後的脈絡,沒去了解限制/規範想要達到的目的,透過犧牲一些自由度以帶來更大的效益,卻一味的遵循著「#前人的教誨」而不知其所以然,其實是很浪費的。
--
當然啦,如果是在既有的產品中,無傷大雅的 name style,我的確傾向 #一致性 優先於 #正確性,但同樣的團隊成員新寫的產品,就應該思考一下,究竟怎樣才是最有生產力、最有效益的作法。
c++變數名稱 在 純靠北工程師 Facebook 的最佳貼文
#純靠北工程師38q
靠北一下某些公司和單位的弱掃工具...
工具都不知道是用什麼年代的都沒更新,http://xn--ihqw88lora.net/ mvc架構就算了,但很多現在基本的c#語法也不認得,明明做了基本的資料檢核,但因為工具不認得語法,所以就認為有風險要我們修正。
還有專案內有兩個Controller的程式寫法都一樣會有SQLInjection問題,但只有一個被掃出來有風險...這弱掃工具的判斷標準真不知道該說什麼...
最麻煩的還是掃出原始碼用了"敏感字元"當作變數名稱是高風險...例如password或pwd之類的...理由是別人拿到專案原始碼的話能推測出這變數很重要&$#^%^&(*(....我只想說"如果專案原始碼都外流出去了,還需要在乎你的變數名稱取什麼嗎..."
👉 去 GitHub 給我們🌟用行動支持純靠北工程師 https://github.com/init-engineer/init.engineer
📢 匿名發文請至 https://kaobei.engineer/cards/create
🥙 全平台留言 https://kaobei.engineer/cards/show/4202
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.
👏 歡迎轉載分享鼓掌