[爆卦]虛擬錢包地址查詢是什麼?優點缺點精華區懶人包

雖然這篇虛擬錢包地址查詢鄉民發文沒有被收入到精華區:在虛擬錢包地址查詢這個話題中,我們另外找到其它相關的精選爆讚文章

在 虛擬錢包地址查詢產品中有3篇Facebook貼文,粉絲數超過3,460的網紅Taipei Ethereum Meetup,也在其Facebook貼文中提到, 📜 [專欄新文章] Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound ✍️ 田少谷 Shao 📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium Uni...

 同時也有1部Youtube影片,追蹤數超過4萬的網紅Sky Finance Channel,也在其Youtube影片中提到,以下是內容提到藝術家Beeple 作品的資料︰ Beeple - EVERYDAYS: THE FIRST 5000 DAYS 尺寸:21,069 x 21,069 pixels 代幣ID:40913 虛擬錢包位址:0xc6b0562605D35eE710138402B878ffe6F2E2380...

  • 虛擬錢包地址查詢 在 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.

    👏 歡迎轉載分享鼓掌

  • 虛擬錢包地址查詢 在 Taipei Ethereum Meetup Facebook 的最佳貼文

    2020-03-24 23:33:18
    有 8 人按讚

    📜 [專欄新文章] 類 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.

    👏 歡迎轉載分享鼓掌

  • 虛擬錢包地址查詢 在 Pazu 薯伯伯 Facebook 的最佳解答

    2019-10-15 08:00:00
    有 158 人按讚

    電腦手機網絡安全(四):有關安全鑰匙 YubiKey,你問我答(頗大篇幅修訂版)+ 香港用戶訂購優惠詳情

    文:薯伯伯

    (超長文,建議先儲存,有需要再找來讀。不想全文讀,只想買 keys,請只看「香港用戶訂購優惠詳情」,第十三條問答及第十四條問答。)

    早幾天寫了一篇文章,提到二步認證的安全鑰匙 YubiKey,無獨有偶,《立場》的另一位博客,《茉莉花開:中東革命與民主路》的作者陳婉容原來早在七月份就聯絡了瑞典的 Yubico 公司,希望取得他們的贊助,在核實身份後,這家瑞典公司寄出了五百條 YubiKey 送給香港人,來自遠方的慷慨之舉,實在令人感動。

    我發覺不少人對於 YubiKey 的功能及用法均有誤解,甚至有人認為「有伏」,或誤以為用上 YubiKey 後反而更危險。我回應了一些評語,整合之後發到自己的臉書專頁,《立場》的編輯看到,問可否轉載到《立場》,所以我又花了一點時間,整理一下文稿。

    後來我跟 YubiKey 的香港代理分銷商聯絡,提到近日大家較為關注網絡保安,他們同意給讀者提供一個折扣優惠,也希望加強普羅大眾對網絡安全的意識。於是,我又再把之前的文章修訂一下,再講解清楚相關的使用細項,希望有興趣的讀者,讀完這篇文章後,可以加強自身的網絡保安防護。

    香港用戶訂購優惠詳情

    先說一下香港分銷商的優惠模式:

    1. YubiKey 的產品,全線八折,目前這個優惠沒有定下限期,但會看看情況再決定何時終止。(這個優惠折扣,其實是我建議的,因為只是想跟官網的教育優惠體齊而已。我希望讀者可以有優惠,但同一時間也不希望分銷商要做蝕本生意。)
    2. 又或者是以原價購買 YubiKey,但會送上 Bitdefender 防護軟件一年的訂閱服務(原價是 HK$ 300 一年)。

    優惠方案之一:

    YubiKey 5Ci:HK$ 440(原價 HK$ 550)
    YubiKey 5 Nano:HK$ 310(原價 HK$ 390)
    YubiKey 5 NFC:HK$ 285(原價 HK$ 355)
    YubiKey 5C:HK$ 310(原價 HK$ 390)
    YubiKey 5C Nano:HK$ 375(原價 HK$ 470)

    優惠方案之二:

    Bitdefender TOTAL SECURITY 2020 的銷售價是 HK$ 300 /年費(可以用五部機),與 YubiKey 合拼購買,會有以下組合優惠:

    YubiKey 5Ci + Bitdefender 一年:HK$ 550
    YubiKey 5 Nano + Bitdefender 一年:HK$ 390
    YubiKey 5 NFC + Bitdefender 一年:HK$ 355
    YubiKey 5C + Bitdefender 一年:HK$ 390
    YubiKey 5C Nano + Bitdefender 一年:HK$ 470

    詳情可以看: https://netmon.zohocommerce.com/categories/yubikey/45023000004418001(注意,不能直接在網站上購買,購買流程在下面有寫。)

    (利申:我的 YubiKey 是自己用原價購買,而各位用以上優惠碼購物時,我是完全不會有任何佣金。)

    購買的流程如下:

    1. 先了解要買哪款型號、數量及價格,然後致電 Yubico 的官方認可香港分銷商 NetMon 查詢有沒有存貨。Coupon code 是 PAZU20。如果有貨,可以直接上觀塘鴻圖道的辦公室購買,以現金交收。

    2. 可以先用 PayPal 或信用卡支付,然後寄到順豐站或「順便智能櫃地址」,運費由買家自行支付,目前順豐的運費有優惠,原價 HK$ 30,在 2019 年 10 月底前只用 HK$ 20。

    Netmon Information Systems
    地址:觀塘鴻圖道 57 號,南洋廣場 15 樓 1 室。
    電話:25272086。
    網址: www.netmon.asia

    至於如何選擇 YubiKey,請看下面的問答:「有很多款 YubiKey,我到底應該選擇哪條?」

    ———

    以下是第二次修訂的〈有關安全鑰匙 YubiKey,你問我答〉,刪去了一些概念重複的問題,又加入了數條問題,還有鳴謝相識於二十多年前的 Ben 深夜通電話,與我分享他的意見。



    問:若果 YubiKey 安全鑰匙被其他人拿到,他們是不是可以直接登入我的戶口?

    答:先說答案,不可以的。我們首先要搞清楚 YubiKey 的用途,它是用來作為登入戶口的其中一個因素,即是說,你要登入戶口,仍然需要帳號本身的密碼,以及 YubiKey,又或是其他因素,例如手機短訊(不建議)、authenticator app 的軟體六位密碼,或是備用的號碼。

    所以即使別人取得你的 YubiKey,也不能單單使用 YubiKey 去登入你的帳戶。「二步認證」時需要你本身的密碼,以及一個額外的認證因素,才能登入戶口。

    如果別人只是取得你的 YubiKey,但又沒有得到你的帳號密碼,那也是沒有辦法登入你的帳號。



    問:我本身已經在手機裡用 authenticator app 去做二步認證,那為甚麼仍然要用 YubiKey 呢?

    答:按保安級別來說,YubiKey 的 FIDO2(在線快速身份識別)比起 authenticator app 的 TOTP(基於時間單次密碼)較為優勝,而 Android 手機的漏洞又較 iPhone 的多。在 iPhone 上好像沒有怎麼出過事,但以前就曾經爆出,Android 機有惡意 app 成功利用保安漏動偷取了 app 二步認證的資料。

    理論上去說,用安全鑰匙來做認證,肯定會較為安全。但很多用家,包括我自己,其實也會在手機上安裝 authenticator app。iPhone 較安全,但即使你用的是 Android,如果手機的廠家較為可信,堵塞保安漏洞的更新較快,你又不 root 機,又沒有胡亂安裝軟件,本身的風險未必算高。

    那麼為甚麼本身已經有用 authenticator app,還要加一個安全鑰匙?我的原因,是因為使用硬件鑰匙,可以加快二步認證的速度及便捷程度,從而把這個二步認證,變成網絡生活的習慣。



    問:我還是不明白,那麼說我豈不是可以直接用手機上的 authenticator app,為電腦登入做認證就可以了嗎?何以要另外花錢,給電腦買一條安全鑰匙?

    答:因為我每天會登出登入戶口數次或以上,所以有必要加快這個過程。先說明一點,網絡保安的兩大關鍵。一是在可行的情況下,開啟二步認證。二是在每次上網之後,都要登出戶口,最好避免儲存電郵或社交媒體的登入狀態。

    最簡單直接的設定,是每次關掉瀏覽器,就會自動刪去所有瀏覽記錄、登入狀態及 cookies,通常是在設定偏好,安全隱私裡可以設置。而我其實即使在自己的電腦上網,也習慣使用「私隱模式」去瀏覽網站。

    當你養成了這個習慣,每天也要登入登出戶口數次。如果你每次看到登入的畫面,都有一種不安的恐懼感,擔心自己不懂如何登入,那麼更加要熟習登出登入的過程,每天登出登入,把登出登入變成生活的習慣,就不會見到 log in 畫面時便忍不住向空氣驚叫或斥罵一聲。如果你已經記不清對上一次是何時登入帳號,那只代表你的戶口經常處於「登入」的狀態,這是保安漏洞,也是很壞的上網習慣,一定要改。

    由於每天登出登入的次數較多,如果能夠安全地加快這個速度,就是值得考慮的方案。我具體去說一下,authenticator app 跟 YubiKey(或其他硬體驗證)在使用習慣上的分別。

    假如你一天要登出登入帳戶五次,如果用的是手機 authenticator app 去做認證,安全程度也算是足夠,但每次都要先找來手機,然後輸入手機的開機密碼,打開 authenticator app,我用的是 Lastpass Authenticator,之後取得六位數字後,複製到剪貼簿,再把六位數字傳送去電腦,或手動輸入,再按確認,這樣才能登入戶口。

    但如果有 YubiKey 或其他硬件認證,過程就相對快速。先輸入帳戶密碼,從鎖匙扣或錢包裡拿出 YubiKey,把 YubiKey 插進電腦,掃一掃上面的金屬圈,便能登入。而我用的 YubiKey,是細小得可以長期插在電腦的 USB C 插頭(一些熟知技術的讀者,知道我的電腦長期插著安全鑰匙,可能會響警號,稍安毋躁,我將會說清楚這個安全隱患)。我每次登入戶口時,先是用手指打完密碼,然後直接伸手在電腦旁邊摸一摸 YubiKey 的金屬環,便能登入。

    所以用 YubiKey 的原因,在我的情況,並不是要把它當成唯一的二步認證因素,而是要加快二步認證的過程。對於不同的用家,這個速度是否重要,很看使用習慣。即使這個速度不重要,單純基於保安考慮,用了安全鑰匙,整個系統的保安級別有所提升。



    問:我應該要有一條還是兩條 YubiKey 呢?

    答:按官方的說法,最好是兩條,因為一條常用,另一條則做後備。但對於大多數用戶來說,其實用一條也是足夠。我會建議大家先買一條,再以其他方式去做後備的密碼重設方案,例如其中一個二步認證的「因素」是 YubiKey,但同一個戶口,要加上 authenticator app 做另一個認證的方案。之後有需要,再買不同型號的安全鑰匙。

    如果你本身打算參加 Google 的高級保護計劃(Advanced Protection Program),你是必須有兩條鑰匙。不過參加了這個計劃之後,使用 Google 的所有服務都會極為不便,我自己也沒有參加。

    簡單來說,對於不打算參加 Google 高級保護計劃的用家來說,只要有後備的認證方案,那麼一條安全鑰匙,也是足夠的。



    問:YubiKey 會否影響我使用 WhatsApp、Telegram 或 Signal?

    答:YubiKey 不支援 WhatsApp、Telegram 或 Signal,所以不會影響你使用這些聊天軟件。



    問:Google 官方推介的那款安全鑰匙,叫 Titan,為甚麼你反而要推介瑞典出品的 YubiKey?

    答:Titan 的製造商是飛天誠信(Feitian Technology),總部設於北京。這家公司獲得不少國家認證及讚許,官方對其安全產品及科技成就予以高度的認可及肯定,目前並沒有證據顯示這家公司的產品有後門或安全漏洞。

    所以,我選擇用瑞典及美國製造的 YubiKey。

    還有,大家可以比較兩者的設計,YubiKey 真係靚仔好多。

    答完這條問題後,發覺 Google 在 2019 年 10 月 15 日(剛好是此文修訂版發佈同一天)推出了一條新的 Titan,這次是跟 Yubico 合作,新的 Titan,設計外觀上跟 YubiKey 5C 大同小異。可能之前 Google 跟 Feitian 的合作,確實引來太多揣測,這次才找瑞典的 Yubico。



    問:如果有人用 YubiKey 插進我的電腦,是否沒有密碼就能直接打開電腦?

    答:這個要看你如何設置,如果你想設置為開啟電腦時,要先輸入密碼,再插入 YubiKey 才能登入電腦,那你應該要使用 pluggable authentication module(PAM,可插拔認證模塊)。相關設定請看 https://support.yubico.com/support/solutions/articles/15000015045-macos-logon-tool-configuration-guide

    如果你使用 PAM 模塊的設定,即使別人取得你的 YubiKey,也不可以打開你的電腦,他是必須有你的 YubiKey,加上你本身開機的密碼,才能登入電腦。

    不過話又說回來,如果是使用電腦,只要設定妥當,其實不用配合 YubiKey 開機,也算安全。因為我是用 Mac 機,也只能用 Mac 機的情況去說一下,如何才算安全。

    1. 你常用的開機戶口的權限只是 standard 而不是 admin。
    2. 你的硬盤本身有開啟加密,即 FileVault。
    3. 你本身 admin 及 standard 的戶口密碼夠強。

    這三點當中,以第三點最為容易被用家忽略,很多人為了貪方便,開機密碼簡單到不能再簡單,有些密碼甚至只有三四個位,極易被破解。尤其開機的密碼,是容許不停地試,即可以使用「蠻力」(brute force)去猜度,所以一定要小心選擇。

    舉個例子,如果你的密碼是 west,破解的時間是 @_$*,兩組密碼,哪個較難破解?前面的那個,是馬上立即就能被破解,而後面這個,用的時間較多,是用一個微秒,也就是一百萬分之一秒而已!

    至於如何選擇強勁密碼,不妨參考骰子密碼法(Diceware),也就是用一粒骰仔,投擲出六位的隨機數字,再用這個數字,透過列表,選擇其對應的字,都是一些字典中可以找到的字詞,如果選擇了七個以上的字詞,這個密碼就很難破解了。有關說明,詳見:https://en.wikipedia.org/wiki/Diceware

    大家也可以去這裡測試一下自己的密碼安全程度,不要輸入真的密碼,差不多就可以,我的密碼,聲稱是要用 919 萬億年才能破解。 https://howsecureismypassword.net/



    問:你認為我可以長期把安全鑰匙插在電腦嗎?

    答:要看使用的場景,以及自己的需要。如果處於高風險環境,把安全鑰匙長期插在電腦中,是不衛生的做法,一些機構甚至明確要求員工不能這樣做,雖然大多員工會對這個建議置若罔聞。

    我的 YubiKey 是用來登入網上的帳號,而不是登入電腦(可以看看上一條問題)。先說我的習慣,我是長期把 YubiKey 插在電腦中,有兩款較細小的型號可以做到這點,分別是 YubiKey 5 Nano 及 YubiKey 5C Nano。

    但我們首先要明白自己想防範的是甚麼,再評估應該要做的安全措施。以我的情況,密碼是極難猜的(按不一定科學的估計,我的密碼可能要 919 萬億年才能破解),而我的密碼又完全不重複,不同網站也會用不同的密碼,所以如果密碼洩露,有三個較大的可能,一是服務供應商的問題,二是電腦被人安裝了惡毒軟件或不乾淨的瀏覽器 add-ons,例如鍵盤記錄器(keylogger)或直接偷取密碼發到遠方,三是上了釣魚網站。至於其他難測的漏洞,很難估計,在這裡就不討論。

    對於第一點,能夠用上二步認證的服務,本身保安做得較好,即使系統受到入侵,估計(估計而已!)密碼的記錄也有加密,所以因為服務供應商的漏洞而洩露密碼的情況很低。至於第二個情況,我本身用的是 Mac,Mac 不是完全沒有病毒或惡毒軟件,所以我儘量不安裝來源不明的東西,有時逼不得已要安裝,也只會在虛擬的環境(virtual machine)中進行。較大的風險可能是瀏覽器的 add-ons 或 extensions,只好儘量找些評分高,信譽好的插件來安裝。

    第三個情況,即釣魚網站(phishing sites) ,通常是假冒的銀行網站。這些網站弄得像是真網站(其實通常還是有些破綻,例如圖片的成像差一些,圖片起角,字體模糊,拼錯英文等等,倒是有點像藍絲的美學風格)。總之打開一些需要登入的網站,都會留意清楚網址,又或是看看有否證書。每次上銀行網站、Google 及 Facebook 等,都一定要加倍小心,因為即使用了二步認證,釣魚網站是可以同時騙取密碼及驗證碼。如果忽然收到電郵,提供連結叫你輸入密碼,更要加倍留意。

    總之評估了自身的使用習慣,最需要防範的風險,是壞人從遠處入侵電腦,並偷取或截取密碼,再入侵我的戶口。所以我只要確保我的認證因素,一個是發到線上的密碼,另一個是線下的因素便可以。即使有人從網絡取得我的密碼,他的手也不能伸到我的手機或安全鑰匙,企圖登入我的戶口,他們要同時取得我的硬件及手機上的二步認證因素,其可能性始終很低。

    另外有些要防範的情況,例如你在公司使用電腦,鄰座的同事相當有可疑,又可以近距離碰到你的電腦,自然就要加倍小心,不要長插鑰匙。你的安全顧慮,也可以因為不同的司法環境,或是本身的敏感程度而改變。若果你是一直備受監控的對象,入侵者有計劃也有資源去取得你的密碼,例如派人偷拍你在咖啡館輸入密碼的情形,入侵者甚至可以取得法庭搜查令,採用不道德的公權力去挾持你的電腦及其安全鑰匙。如果是這樣,你要採取的安全級別,可能要高出其他人很多倍,例如斯諾登要求到訪者把手機的電池取出,又或是要求把 iPhone 等關機後放進雪櫃或 faraday bag。如果你認為他有妄想症,不妨讀一讀《No Place to Hide》(作者 Greenward)又或是《Permanent Record》(作者就是斯諾登本人)。

    說了一大堆,其實就是說,評估過自身的風險後,我使用 YubiKey 的習慣,是經常把它插在電腦上。我不覺得會危害到戶口安全,也不認為會降低安全系數,大家自行評估相關風險。



    問:為甚麼我覺得 YubiKey 有伏?真的安全?這個東西有沒有後門?

    答:可能因為你不了解這個技術,所以覺得有伏。

    說實在的,當我看到這樣的提問,確是頗感驚訝呀,就像看到有人堅拒打疫苗因為擔心會自閉一樣驚訝。



    問:有甚麼服務是支援安全鑰匙的二步認證呢?

    答:對香港人而言,可能有機會用到而又支援安全鑰匙的服務包括:Google (Gmail, Drive, Youtube, Cloud Platform), Facebook, Dropbox, Github, Amazon Web Services, 1Password (版本7以上), Lastpass (Premium), Bitwarden, Dashlane, Boxcryptor (免費版也支援), Twitter 等等。

    至於 Apple ID 戶口則不支持安全鑰匙,但有提供其他方式的二步認證。

    十一

    問:我是用 iPhone,為甚麼我覺得這類產品對 iPhone 的支援,好像很弱很不足呢?

    答:因為這類產品,對 iPhone 的支援,真的很弱很不足啊!即使 YubiKey 出了一款 5Ci 有 lightning 連接頭,但只有極少量的 apps 支援。如果你是用 MacBook 加 iPhone,我建議你只用買 YubiKey 5 (Nano) 或 5C (Nano),而不用為 iPhone 買 5Ci 那款,那個 lightning 接頭很雞肋。

    對於 MacBook + iPhone 的用家來說,最適合的方案,是在 MacBook 用 YubiKey,在 iPhone 還是用 authenticator app。

    如果你只有 iPhone,沒有電腦,那麼很簡單,乾脆不用買安全鑰匙,用 app 去做二步認證就可以。(如果你本身是單機 iPhone 的用家,讀到這裡,才發覺原來我是不建議單機 iPhone 用家使用安全鑰匙,可能會覺得浪費了寶貴的閱讀時間,但希望這篇文章裡其他保安知識,也會對你有幫助啦!)

    十二

    問:萬一我的安全鑰匙遺失了,我是否不能再登入我的戶口呢?

    答:要看你如何設定,但先說答案,不是。如果你遺失了鑰匙,還是可以登入戶口。安全鑰匙只是登入戶口的其中一個認證因素,但你同時可以設定其他方式去認證。

    其他認證的方式包括:

    1. 手機短訊(SMS):因為 SMS 的保安差,不建議。若然真的要用手機短訊,可以用不同居又可信任的朋友手機號碼,而這個電話號碼,最好不是存在手機的電話簿內。

    2. Authenticator app:在 iPhone 及 Android 都有這類 app,我推介的是 Lastpass Authenticator,免費使用,軟件本身可以加上六位數字的密碼鎖。如果你想讓朋友幫你作為後備的方案,建議把設定的二維碼發給朋友,而該朋友又不是朝夕相對,一個 app 裡是可以儲存大量網站的認證碼,而且可以標明服務及戶口名稱,以作識別。

    3. 安全鑰匙:也就是硬件認證方式,其中最多人使用的,是本文裡提到的 YubiKey。

    4. 後備認證碼:部份網站,例如 Google 及 Facebook,會提供八個後備認證碼,可以寫下來,放在安全的地方,但有時貪方便,會儲存在電腦裡(其實不建議這樣做)。

    所以,萬一遺失了安全鑰匙,只要設置合宜,其實也不代表不能用其他認證方式去登入戶口。而在設定了二步認證後,也應該要做一些練習,想像一下,萬一丟失了手機後,你還能用甚麼方式登入呢?如果你的手機、電腦及安全鑰匙全都放在公事包裡,而整個公事包被盜,你還有其他可行的二步認證方式嗎?手機丟失,你不能用 authenticator app。電腦丟失了,而你又貪方便只把後備碼儲存在電腦裡,連電腦也丟失了可以怎麼辦?如果你把不同居的朋友手機號碼作為後備的驗證方案,你能夠單憑手機最後兩個數字,就想起這位朋友嗎?網絡保安,除了要有措施,還有要反複練習。

    另外,如果你使用的是 Google 最高級別的保安計劃(即 Google Advanced Protection Program),那就真的只能用兩條安全鑰匙進行登入。我本身是用 iPhone 及 Mac,因為安全鑰匙對於 iPhone 的支援太弱,所以我也沒有加入這個計劃。

    還有,萬一你喪失了所有認證因素,其實 Google 或是 Gsuite 的管理人,仍然有辦法幫你重設密碼,但 Google 方面的驗證需要很多天,而且過程要問上大量問題,入侵者也不易通過。至於 Gsuite 的管理人,即使他單方面想幫你重設戶口密碼,這個雖然可能會成為另一個安全隱患漏洞,但他們也只能把密碼發到你後備的聯絡方式,而且當中也要有幾重驗證的過程,亦要花上一至數天。只要你那個後備的聯絡方式設定得較安全,入侵者也不能輕易破解。

    十三

    問:有很多款 YubiKey,我到底應該選擇哪條?

    答:有三個考慮因素,一是你用甚麼電腦,二是你用甚麼手機,三是你用甚麼服務。我把幾種可能的情況寫出來,大家參考一下。要先說一點,因為 iPhone 對 YubiKey 或安全鑰匙的支援不好,所以按目前的情況,iPhone 的用家在手機上還是建議用 authenticator app 算了,即使你用的是 NFC 或 lightning 版的安全鑰匙,能夠支援的服務還是太少,可以忽略。選用哪款鑰匙,也要看自己的使用習慣,請參看「每次登入戶口時,都要把安全鑰匙插在電腦,有點麻煩,你認為我可以長期把安全鑰匙插在電腦嗎?」。

    簡單來說,如果你打算長期把安全鑰匙插在電腦,就買 Nano 版,如果經常需要拔插,就買長一點的版本,方便拔插。如果你是用 Android,可以考慮買 NFC 的版本,如果是用 iPhone,因支援較弱,還是用 authenticator app 算了。

    再具體一點去說,我根據以下的電腦及手機組合,建議使用的安全鑰匙型號。

    1. 只有用桌面或手提電腦(USB A接口):用 5 Nano 或 5C(按我的習慣,會用 5C Nano)。
    2. 只有用桌面或手提電腦(USB C接口):用 5C Nano 或 5C(按我的習慣,會用 5C Nano)。
    3. 使用 12 吋的 MacBook(只有一個 USB C 接口的電腦):用 5C 或 5C NFC(就快推出),而不要用 5C Nano,因為只有一個 USB C 接頭,要經常拔插,用 5C 或 5C Nano(暫未推出)會較好。
    4. 電腦 (USB A接口) + iPhone (Lightning接口):用 5 Nano 或 5 NFC(在 iPhone 上不用)。
    5. 電腦 (USB A接口) + Android (USB C接口):用 5 NFC。
    6. 電腦 (USB A接口) + Android (MicroUSB接口):用 5 NFC。
    7. 電腦 (USB C接口) + iPhone (Lightning接口):用 5C Nano 或 5C(在 iPhone 上不用)。
    8. 電腦 (USB C接口) + Android (USB C接口):用 5C NFC(就快推出,暫時未有啊,如果現在用的話,建議可以先買一個 Yubikey 5C Nano,只在電腦上用,手機上則用 app)。
    9. 電腦 (USB C接口) + Android (MicroUSB接口):用 5C NFC(就快推出,暫時未有啊,如果現在用的話,建議可以先買一個 Yubikey 5C Nano,只在電腦上用,手機上則用 app)。
    10. 使用 12 吋的 MacBook(只有一個 USB C 接口的電腦)+ iPhone(Lightning接口):用 5C 或 5C NFC(暫時未出),不建議用 5C Nano。
    11. MacBook Air(有兩個USB C接口):因為兩個 USB C 接口都在機身左邊,如果不會長期用 hub,那麼用 5C Nano 也可以。如果這個插口本身又要連 iPhone 或其他設備,那麼用 5C 會較好。
    12. 以上任何配搭,但用的百度雲、淘寶、QQ 郵箱等:不用買。

    至於 Security Key by Yubico 這一款,則可以用在電腦 (USB A接口) 上,沒有 NFC 功能,屬較為基礎的一款。之前 YubiKey 慷慨送給香港人的型號,就是這個。對於自己有能力購買的用家,請按上文所述的建議,對應自己的機型去購買。

    另外,如果打算用轉換頭(例如 USB A 轉 USB C),請看看相關兼容情況:https://support.yubico.com/support/solutions/articles/15000006473-using-a-yubikey-with-usb-c-adapters (因為沒辦法逐一去試,萬一打開 YubiKey 的包裝後,發覺本身使用的 hub 或轉換器兼容不了,那就得物無所用,所以我不是太過建議用轉換頭。如果真的想用轉換頭,最好找朋友的安全鑰匙插進自己的電腦,再去 https://www.yubico.com/genuine/ 測試能否認出。

    十四

    問:可以在哪裡購買 YubiKey?

    答:上官網 Yubico.com,在香港則去官方認可的香港分銷商。

    購買這類安全產品,跟買安全套一樣,理論上是要避免使用中介渠道或集運公司,因為理論上越多中間人,那麼理論上就越大機會被人做手腳。

    其中一種做手腳的方式,是企圖入侵的人,把鑰匙裡的物理序列號偷偷記錄,並用其他方式去產生密鑰。強調是「理論上」,因為估計實行起來,也非容易,太多顧慮,聽起來好像又太多疑,但既然說到網絡安全,當然要在各個可行的層面,也儘量做好防範的措施。例如萬一你的鑰匙被人偷走,非法扣留,又或是買回來的時候包裝已經打開,最好不要再用。

    Yubico 的官方網站顯示,在香港有一個官方認可以的分銷商:Netmon Information Systems,地址是:觀塘鴻圖道 57 號,南洋廣場 15 樓 1 室。電話是 25272086。網址是 www.netmon.asia ,建議在辦公時間先打電話去查詢存貨量。

    ———

    延伸閱讀:

    陳婉容幫助香港人取得瑞典公司 Yubico 的贊助:https://www.facebook.com/sherrychanyy/photos/a.517784544922353/2803649153002536/?type=3&permPage=1

    電腦手機網絡安全(一):SIM 卡鎖:https://www.facebook.com/pazukong/photos/a.2007886759444126/2634928633406599/

    電腦手機網絡安全(二):簡介二步認證:https://www.facebook.com/pazukong/photos/a.2007886759444126/2636315873267875/

    電腦手機網絡安全(三):二步認證的驗證因素:https://www.facebook.com/pazukong/photos/a.2007886759444126/2637695243129938/

    ———

    * 想追看薯伯伯的文章,請設定本 Page 為「搶先看 / See First」*

    Instagram 🥑🥭🍉🍌: pazu

    新博客:http://pazu.com/blog

    另外還要提一提大家:

    【新書速報】Pazu 薯伯伯《不正常旅行研究所》(白卷出版社)——從西藏拉薩到神州大地;由亞洲各國至中東地區。非常人般玩轉奇異世界、紀錄精彩故事文化習俗。

    在旺角序言、北角森記、誠品書店及各大書店,均有代售!其中在旺角序言及北角森記,有少量簽名版本。

  • 虛擬錢包地址查詢 在 Sky Finance Channel Youtube 的最佳貼文

    2021-03-12 18:47:52

    以下是內容提到藝術家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​ #比特幣​ #加密幣​ #數字資產

你可能也想看看

搜尋相關網站