📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
同時也有3部Youtube影片,追蹤數超過4萬的網紅Sky Finance Channel,也在其Youtube影片中提到,請即訂閱本頻道,如對本集內容有任何疑問,歡迎留言查詢,或發送電郵 至以下地址︰ [email protected] ?本頻道專屬優惠? 本頻道定時為觀眾搜羅最新獨家優惠,歡迎選用。 新手入門︰ 1. 全球最大加密幣交易所「幣安」(Binance) 新用戶永久10%佣金優惠 http...
「幣安錢包地址查詢」的推薦目錄:
- 關於幣安錢包地址查詢 在 Taipei Ethereum Meetup Facebook 的最佳貼文
- 關於幣安錢包地址查詢 在 Taipei Ethereum Meetup Facebook 的精選貼文
- 關於幣安錢包地址查詢 在 台灣物聯網實驗室 IOT Labs Facebook 的最佳解答
- 關於幣安錢包地址查詢 在 Sky Finance Channel Youtube 的最佳貼文
- 關於幣安錢包地址查詢 在 Sky Finance Channel Youtube 的最佳貼文
- 關於幣安錢包地址查詢 在 Sky Finance Channel Youtube 的精選貼文
- 關於幣安錢包地址查詢 在 Bitcoin 比特幣中文社團| 查詢您的以太幣錢包地址.是否有(代幣 的評價
- 關於幣安錢包地址查詢 在 更新日志– Binance API Documentation 的評價
- 關於幣安錢包地址查詢 在 到底要多少錢才能操控虛擬幣市場呢?如何查詢鯨魚錢包地址 ... 的評價
幣安錢包地址查詢 在 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.
👏 歡迎轉載分享鼓掌
幣安錢包地址查詢 在 台灣物聯網實驗室 IOT Labs Facebook 的最佳解答
姚前談區塊鏈和央行數字貨幣的「前世今生」
北京新浪網 (2019-11-14 07:31)
「我認為央行加密貨幣(CBCC)是央行數字貨幣研發的重要方向之一,我國央行的研究起點也就是CBCC。過去十年,數字技術在支付、清算和結算方面出現了重要的新發展。加密貨幣代表了這一波大潮的前沿。」
【編者按】
區塊鏈,這個之前主要在IT和金融領域被廣泛討論的概念,因為中央政治局一次集體學習而迅速在普通民眾間成為高頻詞和「網紅」。一時間,與區塊鏈有關的概念、技術和產業都受到前所未有的關注。
在這其中,區塊鏈與數字貨幣、電子支付等概念關聯更是關注的焦點。「金銀天然不是貨幣,但貨幣天然是金銀」,那麼,區塊鏈作為一種不可篡改和不可偽造的分散式資料庫,其與數字貨幣之間是否也存在這種關係?區塊鏈和數字貨幣到底有何關聯?央行數字貨幣的未來將向什麼方向發展?
就此,中國證券登記結算有限責任公司總經理、央行數字貨幣研究所前所長姚前向新京報記者講述了區塊鏈和數字貨幣的淵源。
中國證券登記結算有限責任公司總經理、央行數字貨幣研究所前所長姚前。
區塊鏈的密碼學緣起及演化
現代密碼學的一個革命性突破是解決對稱密碼演算法無法在大規模的信息加密傳輸中普及的問題。對稱密碼演算法是指加密和解密共用一個密碼,也稱單鑰密碼演算法。
1976年,Diffie(迪菲)和 Hellman(赫爾曼)提出,將原來的一個密鑰一分為二成一對密鑰,一個密鑰用於加密,一個密鑰用於解密。加密密鑰公開,稱為公鑰。解密密鑰不能公開,唯獨本人秘密持有,不能給別人知道,稱為私鑰。比如,張三想給李四發信息,張三要用李四的公鑰對信息進行加密,只有李四的私鑰才能解開,其他任何人都解不開。
1978年,Rivest(李維斯特)、Shamir(薩莫爾)和Adleman(阿德曼)提出RSA密碼演算法,首次實現了非對稱密碼演算法。非對稱密碼演算法除了解決開放系統中密鑰大規模分發的問題,還帶來原來對稱密碼體制不具備的功能,那就是非常獨特的認證功能。比如,張三想給別人發信息,張三不僅用別人的公鑰對報文進行加密,同時還可用張三的私鑰進行簽名,這樣別人就可以用張三的公鑰進行驗簽,判定報文是不是由張三發出。
哈希演算法是現代密碼學的又一個飛躍,它又稱信息摘要。最早的SHA哈希演算法由美國國家安全局設計,於1993年發佈。2010年,中國國家密碼管理局公佈中國商用密碼哈希演算法標準:SM3密碼哈希演算法。
與對稱加密和非對稱加密不同,哈希函數是一種快速收斂的演算法,從輸入到輸出的計算非常快,迅速收斂數值,無須耗費巨大的計算資源,而從輸出倒推輸入又幾乎不可行。基於這樣優秀的特性,哈希函數得到廣泛的應用,我們習以為常的人民幣冠字型大小碼可以理解為是由哈希演算法產生的。
在數字貨幣領域,哈希演算法更是得到廣泛的應用。比如,哈希演算法常常被當做數字貨幣交易挖礦、交易區塊鏈接以及錢包地址壓縮生成的工具。
數字貨幣的由來
一直以來,密碼學家有個想法,既然郵件能夠加密、簽名發送出去,那麼手裡的現金能不能像郵件一樣,加個數字信封,進行加密和簽名后,從一端發送到另外一端?這就是最早的數字現金思想的由來。
1982年,David Chaum(大衛·喬姆)在頂級密碼學術會議美密會上發表了一篇論文《用於不可追蹤的支付系統的盲簽名》。論文中提出了一種基於RSA演算法的新型密碼協議——盲簽名。利用盲簽名構建一個具備匿名性、不可追蹤性的電子現金系統,這是最早的數字貨幣理論,也是最早能夠落地的試驗系統,得到了學術界的高度認可。
但是Chaum當時建立的模型還是傳統的「銀行、個人、商家」中心化模式。隨著交易量的上升,已花費數字貨幣序列號資料庫就會變得越來越龐大,驗證過程也會越來越困難。
2008年,中本聰發表了經典論文《比特幣:一種點對點的電子現金系統》,提出了一種全新的去中心化的電子現金系統,其核心思想之一就是是通過對等網路方式消除單中心依賴,實現點對點交易,同時將已花費的數字貨幣序列號資料庫轉變成未花費的數字貨幣序列號(UTXO)資料庫,控制數據規模,並利用哈希演算法,打上時間標記,縱貫相連。通過這種方式可以構建一種全新的基於全網共識的分散式賬本,把通常意義上的集中式簿記分拆為約每十分鐘一次的分散式簿記,簿記的權利由全網競爭選取,簿記數據按時間順序連接起來並廣播全網。任何節點均可同步到網路上的全部簿記記錄,均可投入計算資源參與簿記權的爭奪。攻擊者如果不掌握全網 50%以上的計算資源,就無法攻擊這套簿記(鏈接)系統。
通過這樣的設計,以前人們隔著萬水千山做不到的點對點交易,現在不依賴銀行等中介機構而僅靠分散式賬本就可以實現。
區塊鏈的革新之處
從系統架構看,區塊鏈技術是一種全新的信息網路架構,打開了傳統中心化系統的圍牆,各節點既可以是客戶端,也可以是伺服器端。這使得C端客戶的自主掌控能力及其在系統中的話語權得到極大的增強。
從會計學角度看,它是一種全新的分散式賬本技術(DLT),採用了全新的記賬方法:每個人都可以參加,所有參與者共有、共享賬本信息,都能檢測、驗證賬本信息。與傳統賬本技術相比,DLT賬本技術的優勢在於不易偽造,難以篡改,開放透明,且可追溯,容易審計不僅能保障多方賬本一致,還能自動實時完成賬證相符、賬賬相符、賬實相符。從技術可行性看,瞬時的資產負債表編製或將成為可能。
從賬戶角度看,它是全新的賬戶體系,傳統上我們所有的金融業務都是圍繞著銀行的賬戶開展的,而現在私鑰本地生成,非常隱秘,從中導出公鑰,再變換出錢包地址,自己給自己開賬戶,不需要中介,賬戶體系發生了變革,這在金融史上是一個非常重大的變化。
從資產交易角度看,它是一種全新的價值交換技術,基於這一技術,我們可以創造一種全新的金融市場模式:作為信任機器,資產交易可以去中介化。
從組織行為學角度看,它使有效的分散式協同作業真正成為可能:沒有董事會,沒有公司章程,沒有森嚴的上下級制度,沒有中心化的管理者,大家共建共享,這是經濟活動組織形式的變革。
從經濟學角度看,它開創了一種新型的演算法經濟模式,以去中介化、開放為特徵,強調和尊重市場交易的自願原則,發揮市場價格的激勵協調機制,兼具計劃和市場兩種機制的優點,是一種更加接近市場的經濟模式。
區塊鏈的不足
一是性能問題。區塊鏈技術的理念之一是分散式共享,但假設近萬個節點都要共享數據的時候,速度自然就慢下來,效率不高。目前比特幣的成交至少要等10分鐘,有時候要等1個小時以上,這是許多人不能容忍的。
二是隱私保護。比特幣的整個賬本是公開的,隱私保護成為了區塊鏈技術的一個研究熱點,一些解決方案已經出現,比如採用零知識證明、同態加密等技術手段。
三是安全問題。目前智能合約還處於初級階段,一旦有漏洞就會被人攻擊,可能出現重大的風險,其安全性需要在技術上進一步改進,形式化驗證是一個可能的解決思路。私鑰的安全保護更是一個至關重要的問題。
四是治理缺失。當社區面臨重大決策事件時,如何讓社區參與進來,以某種機制形成社區意見,最終在區塊鏈上表達出來。
五是互操作性問題。區塊鏈作為新一代價值互聯網並沒有通用的協議,目前都還是社區自組織模式,跨鏈互操作沒有統一的規範,很大程度上限制了應用創新。
區塊鏈技術發展方向
共識協議是區塊鏈的關鍵技術,其核心指標包括共識協議的強壯性、高效性及安全性。目前看,共識協議最大的難題在於如何實現安全性與高效性的平衡。在保障安全性的前提下,大概有幾種提高效能的思路:一是新型共識協議;二是新型數據結構;三是不改變共識協議的系統改進;四是硬體和算力的改進;五是分層分片技術。
現在有各種鏈:公鏈、聯盟鏈和私有鏈。當不同機構之間業務發生交互時,不同的鏈與鏈之間怎麼交互,會成為很大的問題。跨鏈技術是下一步區塊鏈技術發展的重點。
區塊鏈本身即是一種天然投票系統,此前,許多國家的監管部門傾向於將初始代幣發行(ICO)的代幣界定為證券。為此,證券型代幣的區塊鏈系統需要考慮如何將監管部門提出的合規要求內嵌於系統,總體思路是在技術上設置監管介面,改造公有鏈,建立監管聯盟鏈,為監管者提供客戶識別、反洗錢、反恐融資、項目盡調、風險評級、信息披露、風險監測等監管功能。
區塊鏈使自主身份成為可能。它本身可以作為去中心化公鑰基礎設施(PKI)來使得公鑰體系更有用和更安全。
區塊鏈技術創造了一種全新的隱私保護模式:用戶無需讓渡數據權利,個人數據自主可控。例如,用戶自主產生本地公私鑰,通過公鑰計算髮布有效的錢包地址,來隔斷錢包地址和錢包持有人真實身份的關聯,並通過控制私鑰在區塊鏈網路自主完成交易。
數字錢包方面,目前數字錢包都在嘗試從單純的錢包服務轉向數字資產生態入口,希望藉此獲取更大的市場份額,發展更豐富的資產管理服務,主要有資產管理、資產交易、信息聚合、DApp分發等方向。隨著數字資產產業的不斷發展,生態的不斷完善,數字錢包的場景功能將會越來越重要。其未來發展重點有三個方面:一是保證錢包服務的安全、開放和便捷;二是圍繞資產增值需求,搭建數字資產管理平台,為用戶提供豐富的金融產品,提高用戶轉化率;三是打通數字資產與現實世界的連接,豐富數字資產應用場景,構建數字資產生態。
建立在智能合約之上的自組織商業應用,有助於提升區塊鏈技術的價值,使可編程經濟模式的適用範圍和領域不斷擴大。關於智能合約的應用,一方面需要從技術層面保障其安全性;另一方面需要從法律層面明確其合規性。由於智能合約具備天然的確定性,不具有普通合同的靈活性和可選擇性,因此在特定場景中,需要建立允許代碼暫停或終止執行的干預機制。
在與其他科技的融合上,常說的雲計算、大數據、人工智慧、區塊鏈技術等,實質上均是「演算法+數據」的體現,相互之間的融合也是必然。例如,在資產證券化的場景中,需要對底層資產的信息進行持續的披露,同時還需要實現大規模分散式文件存儲。區塊鏈技術可以通過交易簽名、共識演算法和跨鏈技術,保證各交易相關方分散式賬本的一致性,從而在保障交易背景真實性的基礎上,自動實時完成信息披露,從而實現賬證相符、賬賬相符、賬實相符,大大提高可交易產品的信用等級,又大幅降低成本。將區塊鏈技術與分散式文件系統、大數據分析、雲計算、人工智慧等進行融合是未來發展的一個重要方向。
加密貨幣與第三方支付的差異
支付寶的數據傳輸過程加了密,並不代表它就是加密貨幣。兩者的賬戶體系有根本的區別,如果將支付寶的技術比擬為4G,通過加密貨幣的支付更像是5G。
在金融普惠性上,目前的支付體系是多層次賬戶系統,以及對應的信息傳輸專用通道,成本耗費巨大,尤其是跨國支付,導致金融服務費用和門檻高企,金融發展嚴重不平衡,損害金融普惠。同時,支付機構實際掌控了用戶的支付過程,其封閉體系和商業競爭,有可能限制和影響用戶自主選擇權。而通過加密貨幣的支付,省去了「鋪路架橋」的費用,不受傳統賬戶體系和封閉專網限制,直接復用現有的互聯網基礎設施,任何能連接互聯網的人皆可參與,任何參與方都具有技術上的對等性。
在用戶隱私保護上,第三方支付屬於傳統中心模式,個人無法完全控制自己的數據,中心節點很容易濫用用戶數據,且容易成為被攻擊的目標,一旦爆發風險,對個人和平台的危害巨大,Facebook就曾發生過5000萬用戶數據泄露事件。但是區塊鏈技術,創造了一種全新的不依賴中心、多方共享環境下、基於密碼學、用戶自主可控的隱私保護新模式,數據不單點存儲於第三方機構,用戶自主可控地對個人數據匿名化,無需讓渡數據權利。也就是說,數據向哪些人透明、透明程度、是否可被追蹤均由用戶自主掌控。
央行數字貨幣的未來方向
Facebook沒有簡單拷貝比特幣、Ripple幣,也沒有簡單模仿支付寶,而是推出了全新理念的Libra,說明真正代表未來技術發展方向的數字貨幣很可能是既要吸收借鑒先進成熟的數字貨幣技術,又要把傳統貨幣長期演進中的合理內涵繼承下來。
我認為央行加密貨幣(CBCC)是央行數字貨幣研發的重要方向之一,我國央行的研究起點也就是CBCC。過去十年,數字技術在支付、清算和結算方面出現了重要的新發展。加密貨幣代表了這一波大潮的前沿。
中國法定數字貨幣的原型構思,可以從筆者2016年的一篇文章中看到,文中提到我們需充分吸收借鑒國際上先進成熟的知識和經驗,深入剖析數字貨幣的核心技術。一方面,從理論入手,梳理國內外學術界對密碼貨幣的研究成果,構建中國法定數字貨幣的理論基礎;另一方面,從現實入手,對運營中的各類典型電子與數字貨幣系統進行深入分析,構建中國法定數字貨幣的基礎原型。
目前各國開展的央行數字貨幣試驗,比如加拿大央行Jasper項目、新加坡金管局Ubin項目、歐洲中央銀行和日本中央銀行Stella項目等,大都是基於區塊鏈技術的加密數字貨幣試驗,但還停留在批發(機構端)應用場景。這是因為中央銀行一向被認為不擅長零售端業務,有種擔憂是當數字貨幣向社會公眾發行流通時,中央銀行可能會面臨極大的服務壓力和成本。
我們的數字貨幣原型系統探索了區塊鏈的應用,但並不完全依賴該技術。在設計上,它利用分散式賬本不可篡改、不可偽造的特性,構建了一個基於區塊鏈的CBCC確權賬本,對外通過互聯網提供查詢服務,相當於網路「驗鈔機」。這種設計一方面將核心的發行登記賬本對外界進行隔離和保護,同時利用分散式賬本的優勢,提高確權查詢系統和數據的安全性和可信度。另一方面,交易處理仍由採用傳統分散式架構的發行登記系統來完成,分散式賬本僅用於對外提供查詢訪問。交易處理子系統和確權查詢子系統分離並採用不同的技術路線,可以有效規避現有分散式賬本在交易處理上的性能瓶頸。
同時,原型系統還採用了「總/分雙層賬本結構」,既減輕了中央銀行壓力,又保障中央銀行的全局掌控能力。
目前來看,學術界的熱點大多是基於區塊鏈技術的央行加密貨幣的研究。
Libra與各國央行數字貨幣的對比
兩者雖然均採用加密貨幣技術,技術路線有相似之處。但在發行方、技術平台、可追溯性、匿名性、與銀行賬戶耦合程度、是否支持資產發行等方面存在差異。
從貨幣層次看,央行貨幣是M0層次,銀行存款等傳統信用貨幣在M1和M2層次,而Libra則是在更高的貨幣層次。最新統計數據顯示,我國的M0與M2的比值約為4%。與數字M0相比,數字M1、M2……Mn更具想像空間。
從創新角度看,各國央行數字貨幣試驗基本上是比較秘密的「曼哈頓」工程,這種方式未必符合現代開源開放社區的發展需求。
而Libra項目的代碼按照Apache2.0標準開源,任何人都可以按照開源協議標準來查看、複製、部署Libra的底層源代碼,也可以根據自己的想法提交對開源代碼的修改建議,一旦Libra協會批准,該修改就會被納入生產系統。按照開源社區十年來的運作經驗,這種開放和眾智的方式,充分體現了絕大多數參與者的利益,保證項目的凝聚力,促其快速發展壯大,同時也充分促進了技術系統與市場需求的匹配融合,最終培育出一個技術先進、市場認可的數字貨幣生態。
任何數字貨幣均要接受市場的考驗和競爭。
資料來源:https://news.sina.com.tw/article/20191114/33310568.html
幣安錢包地址查詢 在 Sky Finance Channel Youtube 的最佳貼文
請即訂閱本頻道,如對本集內容有任何疑問,歡迎留言查詢,或發送電郵
至以下地址︰
CryptoCareFree@gmail.com
?本頻道專屬優惠?
本頻道定時為觀眾搜羅最新獨家優惠,歡迎選用。
新手入門︰
1. 全球最大加密幣交易所「幣安」(Binance) 新用戶永久10%佣金優惠
https://www.binance.com/en/register?ref=ZJPRK9NK
2. FTX: 以創新崛起,並肩幣安的頂尖交易所(5月24日起香港居民只接受專業投資者註冊,流動資產需有8百萬港元)
https://ftx.com/#a=TheMysteryOfCryptos
3. 老牌交易所Poloniex,成立於2013年,用以下連結尊享10%交易費折扣︰
https://poloniex.com/signup?c=NCZMDANX
免責聲明:這並非財務建議,所有觀眾應對自己的決定負全部責任。本頻
道和講者對任何損失或安全問題不承擔任何責任。投資風險自負,懇請閣
下於投資前自行深入了解。
DISCLAIMER: This is not financial advice, all viewers are fully responsible for the decisions they make. The speakers and the channel shall not be held responsible for any loss or security issues. Invest at your own risk, and do your own research.
#bitcoin #cryptocurrency #比特幣 #加密幣 #數字資產
本節目可使用Likecoin向創作者表示支持,在Chrome 下載Liker Land extension 即可使用︰
https://button.like.co/cryptocarefree
幣安錢包地址查詢 在 Sky Finance Channel Youtube 的最佳貼文
請即訂閱本頻道,如對本集內容有任何疑問,歡迎留言查詢,或發送電郵
至以下地址︰
CryptoCareFree@gmail.com
?本頻道專屬優惠?
本頻道定時為觀眾搜羅最新獨家優惠,歡迎選用。
新手入門︰
1. 全球最大加密幣交易所「幣安」(Binance) 新用戶永久10%佣金優惠
https://www.binance.com/en/register?ref=ZJPRK9NK
2. FTX: 以創新崛起,並肩幣安的頂尖交易所(5月24日起香港居民只接受專業投資者註冊,流動資產需有8百萬港元)
https://ftx.com/#a=TheMysteryOfCryptos
3. 老牌交易所Poloniex,成立於2013年,用以下連結尊享10%交易費折扣︰
https://poloniex.com/signup?c=NCZMDANX
免責聲明:這並非財務建議,所有觀眾應對自己的決定負全部責任。本頻
道和講者對任何損失或安全問題不承擔任何責任。投資風險自負,懇請閣
下於投資前自行深入了解。
DISCLAIMER: This is not financial advice, all viewers are fully responsible for the decisions they make. The speakers and the channel shall not be held responsible for any loss or security issues. Invest at your own risk, and do your own research.
#bitcoin #cryptocurrency #比特幣 #加密幣 #數字資產
本節目可使用Likecoin向創作者表示支持,在Chrome 下載Liker Land extension 即可使用︰
https://button.like.co/cryptocarefree
幣安錢包地址查詢 在 Sky Finance Channel Youtube 的精選貼文
以下是內容提到藝術家Beeple 作品的資料︰
Beeple - EVERYDAYS: THE FIRST 5000 DAYS
尺寸:21,069 x 21,069 pixels
代幣ID:40913
虛擬錢包位址:0xc6b0562605D35eE710138402B878ffe6F2E23807
智能合約位址:0x2a46f2ffd99e19a89476e2f62270e0a35bbf0756
non-fungible token (NFT) (jpg)
由紐約佳士得進行拍賣,結果連佣金以6,934.625萬美元成交!
請即訂閱本頻道,如對本集內容有任何疑問,歡迎留言查詢,或發送電郵至以下地址︰
CryptoCareFree@gmail.com
?本頻道專屬優惠?
本頻道定時為觀眾搜羅最新獨家優惠,歡迎選用。
新手入門︰
1. 全球最大加密幣交易所「幣安」(Binance) 新用戶永久10%佣金優惠
https://www.binance.com/en/register?ref=ZJPRK9NK
2. FTX: 以創新崛起,並肩幣安的頂尖交易所,同時能用加密幣買賣美股及眾多衍生產品(1分鐘線上註冊,5%佣金折扣)
https://ftx.com/#a=TheMysteryOfCryptos
免責聲明:這並非財務建議,所有觀眾應對自己的決定負全部責任。本頻道和講者對任何損失或安全問題不承擔任何責任。投資風險自負,懇請閣下於投資前自行深入了解。
DISCLAIMER: This is not financial advice, all viewers are fully responsible for the decisions they make. The speakers and the channel shall not be held responsible for any loss or security issues. Invest at your own risk, and do your own research.
#bitcoin #cryptocurrency #比特幣 #加密幣 #數字資產
幣安錢包地址查詢 在 更新日志– Binance API Documentation 的推薦與評價
由于矿池钱包合并于资金账户钱包,用户万向划转接口 POST ... 开启以后, 如果收款方为币安账户地址,转账费用为0, 速度快, 不需要提交上链请求。 ... <看更多>
幣安錢包地址查詢 在 到底要多少錢才能操控虛擬幣市場呢?如何查詢鯨魚錢包地址 ... 的推薦與評價
大鯨魚動向其實一直都是虛擬幣漲跌幅的重要一環,每當大鯨魚在游動時總是會帶起幣價漲跌,我們要怎麼利用這些資訊預判漲跌幅呢?沒錯今天我們就要教你 ... ... <看更多>
幣安錢包地址查詢 在 Bitcoin 比特幣中文社團| 查詢您的以太幣錢包地址.是否有(代幣 的推薦與評價
查詢 您的以太幣錢包地址. ... 把手上幣安的luna賣掉,再把busd或是usdt轉到luna低價的交易所,再買進luna,然後就可以翻倍 ... 快给我地址我烧一百万usdt进去. ... <看更多>