教你用Dfinity實現一個開放式二維碼服務

買賣虛擬貨幣
前言Dfinity 的網際網路計算機是一個安全的網路協議,它允許我們將程式碼直接當作服務部署在網路中,這些軟體就像在本地一樣,被執行在這臺無縫共享的超級計算機上。想象一下,就好像你把程式碼傳上到一個超級 Github 上,不用管作業系統等等一些複雜度,後端就可以永不宕機的提供服務了!當然這些都需要用 Dfinity 的 token 來計價。接下來將演示如何在網際網路上建立一個永久的微服務。實現目標準備實現一些簡單的服務,但也得展示網際網路計算機的特性。所以只做“hello world”或簡單算式是遠遠不夠的。我們需要去實現一些真正有用,並能整合到現有的服務裡的東西。
所以深思熟慮之後,我最終決定寫一個二維碼生成服務,用它來顯示加密貨幣錢包的地址。如何搭建網際網路計算機上的程式執行在 WebAssembly 虛擬機器中,因此要構建微服務,只需要寫好程式碼後編譯成 WebAssembly 執行即可。C 和 Rust 裡面都有現成的庫可以產生二維碼,只需要再成 WebAssembly 執行即可。雖然這樣比較快,但是這裡想做點有趣的嘗試,所以決定透過 Motoko 開發。什麼是 Motoko
Motoko 是由 WebAssembly 標準的原作者設計的一門高階語言。它在語法上類似於 Swift 和 unique,獨特之處在於它為網際網路計算機上的特性提供了很好的支援。只需下載並安裝網際網路計算機的 SDK,就可以獲得 Motoko 的最新版本:$ wget https://sdk.dfinity.org/install.sh$ yes Y | sh install.sh預備工作在用 Motoko 為微服務定義介面之前,先回顧一下二維碼的標準,構成二維碼的相關元件如下: 

這些元件所需的相關引數包括:版本號(1到40)、LMQH的四種糾錯級別(分別表示資料丟失容忍度為7%、15%、25%和30%)和編碼方案(可以是數字、字母數字、八位或漢字)。

定義介面

將二維碼的元件型別轉換為 Motoko 的型別:

public type Version = { #Version : Nat };    
public type ErrorCorrection = { #L; #M; #Q; #H };
public type Mode = { #Alphanumeric; #EightBit; #Kanji; #Numeric };
public type Matrix = { #Matrix : [[Bool]] };

我們可以使用這些型別,在 Motoko 中定義一個函式來生成二維碼:

/**
 * Encodes the input text according to the QR code specification or
 * returns null if the input text is invalid for the given mode.
 */
public func encode(
  version : Version,       // Version number. 
  level : ErrorCorrection, // Error correction level.
  mode : Mode,             // Encoding scheme.
  input : Text             // Input text.
) : async ?Matrix { .. };

將以上程式碼封裝在 Motoko actor 宣告中定義介面。

實現

我把實現程式碼放到了 GitHub 上,總共2000多行程式碼,需要十幾個模組支援。可以 git 下來後在 Visual Studio 中開啟,Visual Studio 上有一個可以高亮 Motoko 語法的外掛,比較方便。

$ git clone https://github.com/enzoh/qr
$ code qr

這個二維碼服務在很大程度上依賴於 Motoko 的標準程式碼庫。之前我一直不感冒,用了才知道, Motoko 已經足夠成熟了,並且功能強大。Motoko的 API 和 Rust 與 SML 提供的很相似,所以如果你很熟悉這些語言,那用 Motoko 的時候基本不需要查閱任何的文件。雖然文件網站仍在開發中,然而,透過直接在 Visual Studio 中開啟標準庫,始終可以找到最新的詳細資訊。

$ code $HOME/.cache/dfinity/versions/$DFX_VERSION/stdlib

演示

啟動本地網際網路計算機節點:
$ dfx start

在另一個視窗中執行以下命令
$ dfx build
$ dfx canister install --all
$ dfx canister call demo encode \
$   '(variant{Version=2}, variant{M}, variant{Alphanumeric}, "HTTPS://SDK.DFINITY.ORG")' \
$   | sed 's/[(")]//g' \
$   | sed 's/#/█/g'

結果就輸出來了:

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;