[爆卦]結語範例是什麼?優點缺點精華區懶人包

雖然這篇結語範例鄉民發文沒有被收入到精華區:在結語範例這個話題中,我們另外找到其它相關的精選爆讚文章

在 結語範例產品中有17篇Facebook貼文,粉絲數超過23萬的網紅綠角財經筆記,也在其Facebook貼文中提到, 學語言為的是什麼? 為的是溝通,為的是多一扇看這個世界的窗口。 但在台灣,我們最早開始學的外語,也就是英文。不是學來溝通的,是學來考試。 考試必需有個可評定的標準,所以就考選擇題,不考口語說話。因為前者才有辦法大量閱卷,評定分數。評鑑口語說話能力,需要大量的人力成本。 然後,考試決定教學方式...

 同時也有11部Youtube影片,追蹤數超過3,510的網紅辰旭KEYNO,也在其Youtube影片中提到,是不是很簡單,真的很簡單😏 1. KNOW YOUR GEAR ! 2. 慢快門,就是⋯慢快門⋯⋯ 00:00 Intro 00:45 實際操作 01:16 幾個注意一下的小地方 01:57 什麼時候用 02:40 澄清一下 03:03 結語 03:33 u know what to do 03:...

結語範例 在 Spark Light 工作坊 Instagram 的最佳解答

2021-08-18 20:27:06

|Spark Light 工作坊| 📍|主題| ▫️ 長短期目標之調整與改善 📍|LHS的目標調整範例| ▫️ LHS 小編曾因參加會計師公會的講座,進而對會計師這個職業抱有很大的期待和憧憬,因此暫時把臺大/政大會計的優先順位放到臺大國企前面,而國企和會計在高中學科上的需求是差不多的,轉換成本不...

結語範例 在 ShaNice食光旅人筆記 Instagram 的精選貼文

2020-11-21 16:59:36

充實外在,也要加強腦袋~ 繼先前參加了CLN的邏輯文法班感到收穫滿滿,過往在學習英文的歷程最令人頭疼的許多文法問題,都在Clarence老師耐心講解後迎刃而解,因此,接續參加了電郵寫作班,也在數堂課之後,來和大家分享一下我的心得~ ✍️工作職場上,若有機會遇到外國朋友、客戶、窗口等,免不了的就是要...

結語範例 在 街頭故事 Instagram 的最讚貼文

2020-05-02 07:19:55

「😌如果我還能睜開眼睛的話」  L小姐來到我的攤位坐下。  我是她的高中學弟,不過這是我們初次見面。  「😮哇,李白你的造型轉變滿多的耶。」  -  我在升大學以前都是個瘦瘦的男生,長髮及腰搭配陰柔的氣質,還喜歡可愛的東西。  「人妖」、「娘娘腔」之類的標籤,便如影隨形的陪伴我...

  • 結語範例 在 綠角財經筆記 Facebook 的最佳解答

    2021-09-24 07:11:08
    有 1,537 人按讚

    學語言為的是什麼?

    為的是溝通,為的是多一扇看這個世界的窗口。

    但在台灣,我們最早開始學的外語,也就是英文。不是學來溝通的,是學來考試。

    考試必需有個可評定的標準,所以就考選擇題,不考口語說話。因為前者才有辦法大量閱卷,評定分數。評鑑口語說話能力,需要大量的人力成本。

    然後,考試決定教學方式。許多學生整節英文課,看課本、背句型、記文法,卻是一個英文句子也沒說過。或是只是照著課本覆述,從沒自行建構一個句子,嘗試用英文表達自己。

    這樣學出來的英文,遇到外國人時,一句話也說不出來,是本應如此,還是令人意外。

    有了這樣失敗的第一外語學習經驗,有多少人會願意學第二外語?或者可以在學習第二外語時,跳脫這個失敗模式,成功學習?

    《懂語感,無痛學好任一種外語》,就是這個問題的解答。作者建議先藉由聽與模仿,學會說。再學讀跟寫。

    會說是最核心的語言能力,藉由聽學會說也是最自然的語言習得過程。

    只要會說,你就可以跟外國人交談。用講的表達你的意思,用問的找到你要的答案與協助。

    聽說讀寫四個能力,作者將其分為輸入與輸出兩端。輸入是聽跟讀。輸出是說跟寫。

    要能輸出,才是重點。

    很多人希望自己能說能寫,但整個外語學習課表都是在閱讀跟學單字。這樣也是很認真沒錯。但在錯誤的地方投入資源,不會在正確的地方產生成果。

    你要會說會寫,你就要練習說跟寫。

    這個似乎淺白不過的道理,卻是很多人外語學習的盲點。

    書中列出了範例課表,教一個想偏重口說,或是偏重書信能力的讀者,要如何安排時間。

    這本書的討論很全面。一個生活忙碌的成年人,如何抽出時間來學習外語、如何達成持續的效果、動機的重要性。還有各種學習管道的比較都有分析討論。

    譬如語言交換,似乎單純而美好,不用花錢,還可以交到異國朋友。

    但許多人沒注意到,你是在跟一個未必有語言教學經驗的人往來。有時要嘗試很久,才能找到合適的夥伴。

    而且所謂交換,就是譬如兩個小時的會面談話,一個小時他跟你用你想學的外語談話,另一個小時,你則要用中文跟他談。花兩小時的時間,學一個小時的外語。有時候會讓人覺得時間成本高昂。

    還有費用便宜的線上大型教學平台。看起來選擇超多,每個老師的介紹都很吸引人。其實這種網路平台讓幾乎所有想當外語老師的人,都可以開課。幾乎沒什麼篩選。

    那誰來篩呢?

    就是你。

    篩得到好老師還好。但假如上過一堆老師的課,卻少有人讓你想再約第二節呢?

    有時想要免費或是省錢,結果卻是浪費更多時間跟金錢。

    書中關於制定明確學習目標的討論非常重要,也是很多人欠缺的一點。

    譬如學習30小時後,可以寫一篇簡單的自我介紹。一個期限與可評估的目標,才可以讓學習者知道自己有沒有在前進。

    不要訂下太大太遠的目標。譬如學兩年後,可以跟外國人流利對話。時間太長,回饋來得很慢。假如沒出國,也沒啥機會遇到外國人,很難驗證。

    一小步一小步的成就,終究會累積出可觀的成果。

    最後的結語有個現實的計算。台灣學子從國小到高中,保守估計每人花了兩千個小時學英文。成效如何?有多少人,外語成為一個實用的工具?

    假如能換個更有效的學習方式,會帶來多大的節約與效益。

    看到這些討論,綠角又想到投資這件事。

    台灣成年人,每年花了多少時間選股跟研究?

    台灣加權股價指數從1969年底的110點,到2020年底的14732,是134倍。單純參與到市場的成長,原始投資一百萬,會變成一億三千萬。

    (這還只是加權股價指數喔,沒有計入股息的成果。假如計入股息,成果會更可觀。)

    假如學習挑選股票,讓人達到比大盤更好的成果。假如學習判斷經濟與市場指標,擇時進出,讓人躲過下跌參與上漲,我們應到處可以看到,現在七十歲以上的資深台股投資人,許多人都可以跟你講述投資台股賺200倍、賺300倍的故事。

    有嗎?

    還是連股市本身報酬都拿不到的人比較多?

    或者你簡單就可以找到家族長輩在股市中虧到不敢再投資的例子?

    這些投入研究的時間與精力,用錯方向,拿到比市場更差的成果,都是浪費啊。

    學生時期在錯誤的學習方法中浪費時間,成年後在錯誤的投資方法中浪費時間。回首一生,虛擲時光,所成甚少。

    這難道就是台灣學生跟台灣投資人該走的路嗎?

    面對問題,要從正確的角度下手。而不是只會埋頭苦幹,一心以為有付出必有回報。在錯誤的地方付出,是力倍功半。

    投資,我選擇指數化投資。

    語言學習,《懂語感,無痛學好任一種外語》提供切中要點的解答。

  • 結語範例 在 社會心理,從他們到我們-林仁廷 諮商心理師 Facebook 的精選貼文

    2020-11-06 18:00:35
    有 134 人按讚

    11/9 恭喜,許家甄,抽中書籍。請私訊收件人、地址及手機,由出版社寄出。

    🤤【抽書活動】池上彰-監修;佳奈-漫畫
    《我們為什麼要讀書?為什麼要工作?》:認識世界與自己,啟動未來無限可能(全套兩冊)
    #采實文化

    收到書之後,小四兒子剛好進門說他很無聊,於是我給他這本書〈我們為什麼要讀書?為什麼要工作?〉,他說「好喔,以前我就想這麼問了」,而且裡面又以漫畫作為銜接,就這麼拿去看了。
    .
    我們為什麼要讀書?為什麼要工作?
    那還用說嗎,讀書是為了有好工作,工作是為了有飯吃,再多一點錢就能成家、活的自在…沒了,相當現實(或實用性)的說法。我們以前就這麼傻傻地、無奈地接受命運的安排,為混口飯吃,生活是百般無聊。
    但這本書不同,提出很「日本社會」的觀點,告訴你工作的意義在於幫助他人,每個人都在社會裡被幫助與幫助別人,讓整個社會互助、合作、運行。例如當你打電動玩具時,從電、電視、遊戲機、網路,以及更細的塑膠材料、電子迴路組合…都是有人貢獻的,是一個鏈結。工作是互相幫助,於社會不可或缺,付錢則是用來表達謝意的形式。除了混口飯吃,也多了一份互相尊重。接著延伸生活中的金錢管理(一個月花多少錢,怎麼計算的),從「喜歡、擅長、想做」中來找工作,而進入職場後又該如何人際相處,談工作態度與小心黑心企業。
    .
    全書以一個被成績挫敗而拒學的國中男孩,從東京轉到鄉下,從重視實務的學校裡重新恢復自信,學習溝通。其中,比知識性的理解更重要的是,主角在校遇到的挫折,「在家裡是完全被接納的」,媽媽中年還去教英文發揮成就(提供樂在成就的範例),阿姨發揮所長畫插畫與編輯(提供發揮專長很開心的範例),而爸爸過程中沒出現,留在東京工作,但原來他是寫書的那個人(我爆雷了),奶奶也給予關心…全家都支持主角慢慢探索、找出意義,都是神隊友。家庭的支持系統才能讓一個孩子真正理解「他為何需要讀書,工作意義怎麼找,並朝向工作與生活結合,朝幸福的目標前進」,這才是本書要傳遞的最重要訊息。
    .
    本書是漫畫+圖文書的設計,我家小孩自己看十幾分後就看完了,我問哪有看這麼快的,他說「喔!我只看圖片」。問那本書說什麼,「嗯~就是『工作就是為了生活和可以幫助別人』,『讀書是為了可以有更多選擇做喜歡做的事』…」嗯,基本上都對,但還是少了什麼,我發現閱讀時一定要大人小孩一起邊看邊討論,分享社會經驗,並且讓孩子知道「你生在我們家這件事就是奇蹟」、「活著就有意義」(也是本書結語)。
    PS:我自己的作法,會加上宗教信仰,讀書是為了做好上帝給人類的使命,要做萬物的管理者,知道越多才知道怎麼好好管理,不要糟蹋地球資源。

    有興趣者可以參閱連結購買。分上下兩冊,精裝版
    三民書局采實書系目前79折,三本7折,最低66折(書展109/10/15-11/30)。本書三民連結75折:https://activity.sanmin.com.tw/promotions/2020/1015acmebook/page/A2
    可以進去看更多簡介及目錄

    ♨贈書方式的三條件:
    1️⃣『為心理師粉專粉絲』。不是的趕快去按讚👍️,這可能要調一下,設定公開,否則我看不到你按讚,抽中了也會喪失資格。
    2️⃣『在此篇貼文下方按讚👍 + 轉分享(一定要設公開,看不到分享也失格喔)』
    3️⃣請完整回答此問題的兩項,以自己的經驗:『我讀書是為了XXXXXXX;我工作是為了XXXXXXX』

    🙋‍♀️🙋‍♀️抽書新規則:
    本次書籍為上下兩冊精裝本,A4大小,定價960元,故僅能抽 1 本🙋‍♀️
    會從完整完成條件的粉絲中抽1本
    。    
    活動日期:109/11/6 (五)18:00~11/9(一)12:00截止喔,11/9(一)中午後公布 1 位幸運粉絲🙋‍♀️
    ⚠️中獎名單於貼文標題上公告
    ⚠️得獎者請私訊寄送地址,轉出版社為你寄出。

  • 結語範例 在 Taipei Ethereum Meetup Facebook 的最佳貼文

    2020-05-20 01:51:33
    有 21 人按讚

    📜 [專欄新文章] Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound
    ✍️ 田少谷 Shao
    📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium

    Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound

    V̶y̶p̶e̶r̶ Solidity coding time!

    Image source: https://uniswap.org/

    Outline

    一. 前言二. 程式碼結構 1. Wrapped Ether(WETH)? 2. Impermanent Loss三. 創建交易對 - 準備 Interfaces四. 注入資金 - 注意事項五. 兌換虛擬貨幣六. 取得報價作為預言機七. 自行兌換 WETH八. 結語

    一. 前言

    暨上一篇解釋了 Uniswap 的演算法後,由於個人有使用 Uniswap v2 的需求,因此整理後寫成本篇,希望能幫助到其他也需要用 Uniswap 的讀者!(不熟 Uniswap 的人也可以參考區塊勢 許明恩 Astro Hsu 寫的介紹文:點我)

    Uniswap 解析:恆定乘積做市商模型 Constant Product Market Maker Model 的 Vyper 實作

    本文希望透過實際操作 Uniswap 我個人會用到、我認為大家比較常會用到的功能,來讓不熟悉的讀者快速了解其程式架構(v2 相較 v1 繁複)、熟悉實作方法,無法顧及全部還請見諒。

    以下實作的測試環境為 Rinkeby 測試網,由於只是要講解使用方法,因此選擇在 Remix 上操作。

    而 Uniswap v2 跟 v1 的差異,個人沒有很認真研究,大致列舉以下幾點,本文只會就其中幾點在後方進行較詳細的解釋:

    使用 Wrapped Ether, WETH (於 二. 程式碼結構 解釋),讓 ERC20 交易對不再需要透過 Ether ,降低 gas 的消耗,但還是可以用 Ether 支付

    加入時間權重的預言機,降低被操縱價格的風險,於 六. 取得報價作為預言機 中舉例說明,有興趣者可以看看 白皮書 有詳細介紹

    閃電貸

    使用 Solidity 而非 Vyper,因為 Solidity 功能上較齊全,於 五. 兌換虛擬貨幣 中舉例說明原因

    在開始之前,本文超長,播個背景音樂吧:

    二. 程式碼結構

    本段落簡單描述 Uniswap 程式碼各部分的功能。若讀者要自己實作,可以參考此處得知該去哪一份程式碼找相應的功能:

    Factory / UniswapV2Factory.sol : 創建交易對、查詢交易對的地址與總數;查詢、指定交易對手續費的收款地址

    Pair(ERC-20) / UniswapV2ERC20.sol : Uniswap 流動性代幣 ERC20 的部分

    Pair / UniswapV2Pair.sol : Uniswap 流動性代幣的其他部分;查詢交易對資訊

    Router / UniswapV2Router01.sol : 注入、取出流動性/資金;兌換虛擬貨幣。此合約看似最複雜,其實只是因為收付款的單位可以是 Ether 或是 ERC20,所以有很多重複的函式

    ExampleOracleSimple.sol, ExampleSlidingWindowOracle.sol : 預言機的範例程式碼

    Library / UniswapV2OracleLibrary.sol : 供預言機調用的函式

    Library / UniswapV2Library.sol : 供內部調用的函式

    除了描述程式碼結構,為了以下的實作我們還需要知道 Wrapped Ether 是什麼,順便了解其使用原因:

    1. Wrapped Ether (WETH) ?

    從字面上來解釋,Wrapped Ether 是被包起來的 Ether。那為什麼好好的 Ether 不用還要創造出另一版本,嫌這小小世界的術語不夠多嗎 (ETH, WETH, Dai, aDai, cDai, sDai…)?xD

    wETH | ERC20 tradable version of ETH

    主因有兩個:廣泛地說,Ether 是以太坊上的原生虛擬貨幣,但它與廣為使用的 ERC20 標準並不相容( ERC20 有 approve(), transfer() 等等功能);而針對 Uniswap 的場景來說,v1 的交易對都一定有 Ether,而使用 Ether 可能會造成 Impermanent Loss,於下方解釋。

    因此,就以上兩點的解決方法個別是:

    部署一 ERC20 <-> Ether 的兌換合約:使用者將 Ether 付給 Wrapped Ether (ERC20) 的智能合約,合約就會給使用者同等數目的 WETH;拿回 Ether 則有點不太一樣,方法是告訴 WETH 的合約使用者要 withdraw(),WETH 的合約就會把使用者 WETH 擁有的額度設回 0 (或減少) 並返還 Ether,於 五. 兌換虛擬貨幣 中舉例說明

    v2 交易對的建立不再只能是 (Ether, ERC20),可以是 (ERC20, ERC20)

    2. Impermanent Loss

    Impermanent loss 在 DeFi 指的是像 Uniswap 這類用演算法的去中心化交易所,如果交易對是兩幣價不相干的虛擬貨幣,例如:穩定幣 (Dai, USDC, etc) 和 Ether,流動性提供者 liquidity provider 會因為幣價的相對波動而比起直接持有兩幣還損失了一筆。

    容我舉個例解釋清楚點,可以搭配我上一篇所寫的 Uniswap 的演算法 來理解:假設一開始 1 Ether 幣價為 100 Dai,只有一流動性提供者 LP 投入了 1 Ether 及 100 Dai (1 * 100 = 100 = k,k值要維持不變),總價值為 200 Dai。當 Ether 的幣價來到 200 Dai,眼尖者會發現資金池中的 Ether 價格低、有利可圖,因此會進行套利,例如:拿 33 Dai 約可以換到 0.25 Ether (0.75 * 133 ≒ 100),比起市場上要用 50 Dai 才能換到 0.25 Ether,套利者賺到了。此時,流動性提供者若將自己的資金提出,0.75 Ether 和 133 Dai 此時的總價值是 283 Dai,看似比當初的 200 Dai 還多,但其實將兩幣放著不動 1 Ether + 100 Dai 在此時就已經是 300 Dai 的價值了。於是,impermanent loss 就變成了 permanent loss :(

    三. 創建交易對

    - 準備 Interfaces

    在開始之前,由於使用到的合約不少,所以我將全部所需整理在此:點我。其中,UniswapImplementation.sol 是本文實作的檔案。

    若讀者在自己調用 Interface 時遇到版本問題,就依照 compiler 提供的指示稍作修改即可。我所整理的合約都修正過版本的差異、以下的實作也測試了可行,因此可以安心使用。

    進入正題

    通常大家使用的 Uniswap 資金池都是已經存在的,而如果想要上架自己的虛擬貨幣就要自己創建一組新的交易對,有兩種方式:在 Uniswap 官網上執行或是透過呼叫 Uniswap 的合約來建立,本文使用合約的方式。

    首先,我們需要決定資金池為哪兩種虛擬貨幣,那就很普通地選 ETH 和 Dai 吧。雖然選了 ETH,但如同上方所述實際上必須使用 WETH,於是記下其在 Rinkeby 上的位置 。Dai 就使用 Compound 部署在 Rinkeby 上的版本,位置在 0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa。

    接著,打開 IUniswapVFactory.sol,依照官方文件的指示將此合約部署在 Rinkeby 上的 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f。以下會有許多由 Uniswap 文件得知的合約地址及其他資訊等等,就不再一一附上來源或畫面截圖!

    如上圖黑框所示,輸入了地址後按下藍色按鍵就完成部署了。接著,如下圖將 Dai 的地址 及 WETH 的地址輸入 createPair():

    由於這個交易對我已經部署過了,因此讀者若想嘗試就麻煩去找別的 Rinkeby 上的測試幣了、或自己發一個! 完成後可以用 getPair() 輸入兩幣地址來確認交易對被建立成功:

    如果想要進一步核對,可以先呼叫下圖紅框中的 allPairsLength(),得知當前總共有幾組交易對,再將 (交易對數 - 1) 輸入 allPairs(),就能得到和上圖一樣的地址。需要減 1 是因為陣列的 index 從 0 開始。

    allPairsLength 的值會因為其他人的使用而增加,故日後可能會和本圖產出的 9 不同

    四. 注入資金

    看到標題的讀者可能會想:為何要把注入資金/流動性和上方的創建交易對分開呢?因為注入流動性這個功能被放在了 UniswapV2Router01.sol 中,所以就分開解釋。

    雖然上一節只需要複製貼上按按鍵,但接下來要探討的注入資金 addLiquidity() 及虛擬貨幣的交換 swap()比起創建交易對 createPair() 是較有可能被融入到其他 DeFi 服務的功能(應該不太會有人會一直需要創建新的交易對),因此打開 UniswapImplementation.sol、要開始 Solidity coding!

    如果不熟悉為何別的 DeFi 會需要在自己的服務中使用 Uniswap,可以搜尋 DeFi Money Lego/ DeFi 樂高,顧名思義就是在一個 DeFi 服務上使用另一個 DeFi 服務。實際的例子有:Aave 的新功能是可以拿往 Uniswap 注入流動性後得到的流動性代幣再投入 Aave 來賺取利息,以及下一節兌換虛擬貨幣的功能可以在 Pelith 的輕鬆貸 EasyDai、一站式 DeFi 組合工具 Furucombo 等場景中看到他們如何將 Uniswap 銜接上其他的 DeFi 服務。

    回歸正題

    在開始之前,先簡單提及一下有哪些變數、instance 需要初始化:

    我們要呼叫 Uniswap 合約的 instance 來進行互動: IUniswapV2Router01

    不只需要 Dai 的 instance,也需要 Dai 和 WETH 的地址;DaiAmount 和 ETHAmount 是為了稍後注入流動性所設置的,本文假設第一筆流動性我們使用 200 Dai + 1 Ether

    immutable 是版本 0.6.5 加入的,用途是讓變數只能被讀取 read-only,但不同於 constant 的是能夠在 constructor() 中賦值。之所以各 instance 的地址不一起加上 immutable ,是因為若加上了,這些地址就不能在 constructor() 中被使用

    p.s. 由於 gist 沒有 Solidity 的 syntax highlighting,所以隨便用了 .js 請忽略

    看完了初始設定後,由於我們目前鎖定的資金池是 Dai 及 ETH,因此使用如下的 addLiquidityETH() 此函式,可以直接匯入 ETH 及 Dai。

    本處我使用長度為 3 的陣列 addLiquidityResult 來記錄注入資金後的返回值:注入 Ether 的數量、Dai 的數量及返回的 Uniswap 流動性代幣的數量。實際上應該要依照不同使用者記錄的他們執行 addLiquidity() 後各自的返還值

    第五行中的 approve() 是為了讓 UniswapV2Router01 的合約能夠從我們部署的合約 UniswapImplementation 取得 200 Dai 的使用權

    於第六行 addLiquidityETH() 後方的大括號 {value: ETHAmount},這是 Solidity 0.6.0 後版本如果要在呼叫 function 的同時送入 Ether 的標準寫法,以前的寫法 .value() 目前也還能用但 compiler 會給提示

    addLiquidityETH() 的第三、四個參數為最少要成功注入的數量。使用者能夠成功注入的數量取決於資金池中兩虛擬貨幣當下的數量,而本處直接給 0 比較方便

    這邊非常重要的是上述程式碼還欠缺了一個無法被寫在合約內的步驟:使用者要同意這個被部署的合約 UniswapImplementation 可以從自己的帳戶中轉出 200 Dai。因此,將 ERC20 (Dai) 部署在 Rinkeby 上的位置,也就是0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa,接著輸入被部署合約的地址以及 200 Dai = 200000000000000000000、按下 approve() 後準備作業完成,如下圖。

    終於可以呼叫 addLiquidity() 了! 如下圖,在紅框中以 1 Ether 呼叫黑框中的 addLiquidity() 後,就能成功將資金注入到 liquidity pool 了! 由於本文寫在測試後,因此沒有留下第一次 addLiquidity() 的結果 :(

    此處被部署的合約位置跟上方截圖不同,因為其中測試了一些東西所以重新部署qq

    接著,可以拿出 IUniswapV2Pair.sol,將其部署在 三. 創建交易對 中成功部署的位置 0x03E6c12eF405AC3F642B9184eDed8E1322de1a9e,使用黑框中的 getReserves() 就可以看到資金池中確實有匯入的資金! (本處依然沒有第一次使用後的截圖,因此截圖只是為了讓讀者看到 getReserves() 的結果)

    此圖黑框中的值代表:在資金池中,Dai的數量、Ether的數量及上一次匯入資金的時間戳記

    - 注意事項

    使用 addLiquidity() 時需要小心的地方是:除了第一筆注入的資金可以自行決定兩虛擬貨幣的數量,第二筆開始就會依照其演算法算出兩幣可以投入的各自數量,因此使用者放入的兩幣中可能會有部分的其中一幣被 Uniswap 返回。

    上方的程式碼只是為了第一筆流動性所寫,如果不是第一筆的情況就需要用成功注入流動性後的返回值(例如筆者的作法是用一陣列 addLiquidityResult 來存結果)來把沒有成功注入的資金返回給使用者。

    五. 兌換虛擬貨幣

    本節使用的兌換功能依舊是來自 IUniswapV2Router01.sol。

    由於兌換虛擬貨幣實際上只有五行不到的程式碼,那麼就來把兌換 Ether 而得到的 Dai… 投到 Compound 來賺取放款利息吧! (雖然只是在測試網) 如果覺得這個場景似曾相識,沒錯,這就是上面提到的 輕鬆貸 EasyDai 的不專業版本!

    首先將 Ether 和 Dai 互換的邏輯完成:

    Ether 換 Dai : 使用 swapExactETHForTokens(),給某數量的 Ether 能換多少 Dai 是多少

    Dai 換 Ether : 使用 swapExactTokensForETH(),作法只差在要把 Dai 轉到當前合約,再同意 UniswapV2Router01 可以從當前合約把 Dai 轉走

    兩個做法的第二個參數都是可以自行指定兌換的路徑,此處就直接給 WETH 和 Dai 的地址即可(順序有差)。需要注意的是這個路徑要是動態陣列 dynamic array,而這就是 Vyper 所不支援的功能! 動態陣列跟靜態陣列宣告方式的差別我有註解在程式碼中

    此處就先來試試 Dai 換 Ether 吧!和上方一樣,在使用時也要先 approve() 當前合約,當前合約才能轉走使用者的 Dai。

    由上方的截圖可以很清楚的看到 Dai 換 Ether 這個動作牽涉到的資金轉移路徑:

    Dai: 我的帳戶→當前合約→交易對所在合約

    WETH: 交易對所在合約→UniswapV2Router01

    Ether: WETH 合約→UniswapV2Router01→我的帳戶

    以上的路徑有些人稍微思考後可能會納悶:為什麼上方沒有一筆 WETH 從 UniswapV2Router01 再轉到 WETH 合約的動作呢? 這就是在 Wrapped Ether (WETH) ? 中提到的案例。原因是:把 WETH 還回 WETH 的合約時實際上使用的函示是 withdraw() 而非 transfer(),而在 WETH 合約中發生的只是把使用者 WETH 擁有的額度歸零或減少而已。

    接下來就是把 Dai 轉到 Compound 的部分。由於 Compound 不是本文重點,此處只求功能正常,因此比起真正的實作方法當然是簡化許多。

    一如往常初始化 Compound 合約的 instance

    ETH 換 Dai 後放入 Compound : 將用 ETH 換得的 Dai 的數量,也就是 swapExactETHForTokens() 返回的第二個值,approve() Compound 的合約後就可以用 mint() 匯入了! 要注意的是,ETH 換成 Dai 後的收款地址(第四個參數)是當前合約,才能從此合約轉 Dai 到 Compound

    還款給使用者: 用 redeem() 取出 Dai,一如往常同意 UniswapV2Router01 使用 Dai 的權力

    之所以說這個程式碼不能真的拿來用是因為:cDai 轉給使用者、讓使用者自己持有是比較安全的作法;即使選擇把 cDai 留在當前合約,以上程式碼檢查 cDai 數量是用當前合約 address(this) 去檢查,實際上應該要去記錄每個使用者所擁有的 cDai 數量

    最後附上截圖,可以看一下資金的轉移路徑:

    ETH -> WETH -> Dai -> cDai (Compound)

    cDai -> Dai -> WETH -> ETH

    六. 取得報價作為預言機

    若使用 Uniswap v1的報價作為預言機,攻擊者可以利用其演算法造成的滑點來操控價格。為此,Uniswap v2 提供了兩個加入時間權重的合約範例:

    ExampleOracleSimple.sol : 簡單版

    ExampleSlidingWindowOracle.sol : 複雜版;Sliding Window 在此場景是指透過改變擷取資料(歷史價格)的片段,用該特定期間的價格來做成時間權重,讓使用上更靈活!

    本處以簡單版為例。打開 ExampleOracleSimple.sol,由於一些匯入檔案的問題我將 UniswapV2OracleLibrary 也放在這份檔案中。

    做法非常簡單:將 UniswapV2Factory、Dai 及 WETH 所在的地址作為部署合約 ExampleOracleSimple 時的輸入值就完成了。部署成功後會有個 24 小時的鎖 Time lock,因為這個預言機是有時間權重的,所以並不是一部署完就能立刻使用。若要體驗更新價格此功能可以使用我部署的兩個,其位置我寫在註解中。

    將 WETH 或是 Dai 的地址和要查詢的數量輸入 consult() 就能查到兩虛擬貨幣的價格:

    1 ETH 價格約為 97 Dai

    1 Dai 價格約為 0.01 ETH

    然而,在測試網上我們沒辦法拿著預言機查到的價格套入演算法來核對,因為測試網上的 Uniswap 沒有啟用收費機制,而 k 值要在收費機制啟動時才能被計算,欲知詳情者就麻煩去看官方文件了!

    七. 自行兌換 WETH

    上方雖然有提到 WETH 在 Uniswap 中的使用原因及場合,但或許有人想試著自己動手將 Ether 換成 WETH、把 WETH 換回 Ether。方法非常簡單,將 WETH.sol 部署到 0xc778417E063141139Fce010982780140Aa0cD5Ab 就能使用,如下圖:

    按下綠框中的 At Address 後,使用下方黑框中的 deposit 搭配在中間的黑框輸入所要兌換 Ether 的量,就能成功換到 WETH。同理,圖中未顯示的 withdraw 功能就是讓人輸入 WETH 來換回等量的 Ether。

    稍微提一下,如果是第一次兌換,將 WETH 所在的地址輸入 Metamask 就能在錢包中看到自己擁有的 WETH 的數量,如下兩圖:

    Voila!

    八. 結語

    呼,雖然上述操作及程式碼的撰寫其實還蠻簡單的,但畢竟 Uniswap 的功能不少、我個人也希望能將小細節解釋清楚些,因此長度遠超過預期...有看到結尾處的讀者,辛苦了xD 希望大家現在對於 Uniswap v2 的內容跟實作方法都很清楚了!

    最後,如果本文有任何錯誤,請不吝提出,我會盡快做修正;而如果我的文章有幫助到你,可以看看我的其他文章,歡迎一起交流 :)

    田少谷 Shao - Medium

    Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.

    👏 歡迎轉載分享鼓掌

你可能也想看看

搜尋相關網站