1. 程式人生 > >Mixin 開發簡明教程 1:寫個機器人

Mixin 開發簡明教程 1:寫個機器人

我是 @lyric,本教程應 Mixin COO @薄荷 邀約而寫,旨在向區塊鏈領域以外的工程師們介紹如何以依託 Mixin Network,用最簡單的方式開發自己的區塊鏈應用程式。

本文是系列教程的第一篇,如果對本文感興趣,你可以:

方便獲取後續更新。


為什麼是 Mixin

從 BTC 到 ETH 到 EOS,相信很多工程師都對區塊鏈有一些瞭解,並對其中的故事有所耳聞。就技術本身,無論是 BitCoin 的基礎技術模型,還是從 ETH 開始智慧合約,抑或是 EOS 獨特的架構——可能讓第一次接觸的工程師會覺得有一些不適應,開發 Dapp 也變得困難。

實際上,每一條公鏈都(聲稱)有自己獨特的應用場景,對此提出了特異性的技術。對於開發者來說,這些涉及複雜密碼學的技術變成了進入門檻。而 Mixin 做的事情是抹平了所有公鏈在“交易”這個層面上的差異,專注於“交易”本身

在 Mixin Network 中,你可以使用最熟悉的技術棧和協議,輕易地將“數字貨幣”屬性加入到自己的專案中,實現“零售、打賞、貨幣交易”等所有跟“交易”相關的功能;也可以藉助 Mixin Network 的 DAG 網路,將(廣義的)“區塊鏈”屬性加入到自己的專案中,實現“版權、存證、追溯、資訊披露”等所有跟“區塊鏈”相關的功能。

綜上所述,使用 Mixin Network,可以讓你的想法很輕鬆地在區塊鏈上實現,不需要關注很多繁瑣的技術細節

小貼士

所謂 Dapp,為 Decentralized Application[^1] 的簡稱。一般認為 Dapp 由智慧合約(即在區塊鏈上運作的程式碼)編寫。

Mixin 對此有不同看法。Mixin 的支持者信仰 Unix 哲學[^2]中的 “讓程式只做好一件事”,Mixin 只需要做好“Transaction” 這一件事,因此 Mixin 並不支援智慧合約。這也是為什麼你可以使用自己熟悉的技術棧來寫應用,而不僅僅侷限於少數程式設計語言的原因。


註冊 App

在開始之前,你需要在 Mixin Network 中註冊自己的 App。在 Mixin 開發者中心

https://developers.mixin.one/dashboard ,提交圖示、名稱、描述,URL 等基本資訊即可完成註冊。這很類似於常見的開放服務。

註冊完成後,點選 “Click here to generate...” 生產必要的金鑰等資訊,各部分如下圖所示:

Register APP

Mixin Network 把 App 當作一個使用者,因此 User Id 用於在網路中唯一標識該 App。每個 App 自帶一個資產賬戶,直接向這個 User Id 轉賬會進入到賬戶中。

而下面的其它資訊,如 Client Secret、PIN、SessionId、Pin Token、Private Key 等則用來操作賬戶,執行更新資訊、轉賬、查賬等操作,等會兒我們會用到。請務必記住它們,並且不要洩漏。

我預先註冊了一個 Hello Bot,Mixin Id 為 7000101423。可以在 Mixin Messenger 中加為好友體驗。


Hello world.

接下來,我們來寫 Hello world。

任務描述:使用者在 Mixin Messager 中向機器人說 sync,機器人回覆 ack

簡化起見,我會在專案中使用 MixinNetwork 的 Bot SDK:github.com/MixinNetwork/bot-api-go-client,並且使用 Golang 語言來進行程式設計。因此,接下來我假設你已經將 Golang 開發環境安排好了,並且知曉如何使用 Golang 編寫程式

1. 準備 SDK 和專案目錄

本文的開發環境為 macOS,所用的 Golang 版本為 go1.11.2。

我們先安裝 Bot SDK

$ go get -u github.com/MixinNetwork/bot-api-go-client

接下來我們可能還需要安裝其它依賴的模組,請使用 go get 指令安裝,我不再贅述。

準備一個目錄,用於存放專案和原始碼,我將其命名為 hello-bot;在其中新建 config.yml,用於存放配置;最後在 hello-bot 下新建 main.go,主要程式碼將在其中。

$ mkdir hello-bot
$ cd hello-bot
$ touch main.go
$ touch config.yml

2. 理解 Mixin Messenger 機器人的運作原理

在正式開始之前,先理解一下 Mixin Messenger 機器人的運作原理。

雖然 Mixin Messenger 的資產體系建立在 Mixin Network 之上,但使用者和訊息體系則是獨立的。使用 Mixin Messenger 聊天的時候,由伺服器提供訊息的中轉。

在伺服器看來,機器人就像是一個參與聊天的普通使用者。因此跟機器人聊天時,訊息也會由伺服器轉發到機器人所在的機器,由機器人程式進行處理和應答。

由於機器人像一個普通使用者,所以它也有自己的錢包(在 App Dashboard 上可以看到)。因此,如果涉及到轉賬,機器人可以通過 Mixin Network 來操作自己的賬戶,進行轉賬等自己操作。

3. 配置機器人

在上一章節"註冊 App"中,我們得到了 Id 和私鑰等機器人的資訊,需要將它寫到配置檔案 config.yml之中:

client_id: YOUR CLIENT ID
client_secret: YOUR CLIENT SECRET
session_id: YOUR SESSION ID
pin: YOUR PIN
pin_token: YOUR PIN TOKEN
private_key: |
  -----BEGIN RSA PRIVATE KEY-----
  ...
  -----END RSA PRIVATE KEY-----

請按照之前的資訊挨個填寫。其中私鑰 private_key 是一個多行文字,請確保遵從 yaml 的多行文字語法,每一行的行首都要對齊

在原始碼中,我提供了 config.example.yaml,可以修改它為你的配置檔案。

4. 接收訊息

一個機器人,最核心的部分是訊息迴圈。這個訊息迴圈會不斷檢查伺服器的訊息佇列,是否有給它推送新訊息。

我們在 main.gomain 函式中,使用 NewBlazeClient 方法建立機器人客戶端。client 是一個模組級變數,方便別的函式呼叫:

// Create a bot client
client = bot.NewBlazeClient(
    config.GetConfig().ClientID,
    config.GetConfig().SessionID,
    config.GetConfig().PrivateKey
)

config 模組會負責從config.yml 中讀取必要的配置。

然後使用 client.Loop 開啟訊息迴圈。關鍵的處理函式被定義在介面 handler 之中,實現為 OnMessage

// Start the loop
for {
    if err := client.Loop(ctx, handler); err != nil {
        log.Printf("Error: %v\n", err)
    }
    log.Println("connection loop end")
    time.Sleep(time.Second)
}
type Handler struct{}
...
func (r Handler) OnMessage(ctx context.Context, msgView bot.MessageView, botID string) error {
    ...
}

其中,msgView 是關鍵的引數,它包含了所有跟本次訊息相關的資訊。在 SDK 原始碼中,它的定義是這樣的:

type MessageView struct {
    ConversationId string // 會話 ID
    UserId         string // 對方使用者 ID
    MessageId      string // 訊息 ID
    Category       string // 訊息型別,文字、圖片還是視訊等
    Data           string // 訊息的資料,具體的訊息內容
    Status         string // 訊息狀態
    Source         string 
    CreatedAt      time.Time
    UpdatedAt      time.Time
}

包含了一條訊息所需的全部資訊。

機器人處理訊息時,需要對 msgView 進行拆解,然後作出應答。

func (r Handler) OnMessage(ctx context.Context, msgView bot.MessageView, botID string) error {
    // 我們只處理 PLAIN_TEXT 型別訊息,並且只應答當前對話。
    if msgView.Category == bot.MessageCategoryPlainText &&
        msgView.ConversationId == bot.UniqueConversationId(config.GetConfig().ClientID, msgView.UserId) {
        var data []byte
        var err error
        if data, err = base64.StdEncoding.DecodeString(msgView.Data); err != nil {
            log.Panicf("Error: %s\n", err)
            return err
        }
        inst := string(data)
        log.Printf("I got a message from %s, it said: `%s`\n", msgView.UserId, inst)
        }
    ...
}

首先我們確定只處理文字訊息,因此要先對 msgView.Category 進行判斷。然後使用 UniqueConversationId判斷訊息是否來自對方所在的會話。

然後將 msgView.Data 進行 Base64 解碼,獲取到其中的訊息內容,儲存到變數 inst 之中。

5. 回覆訊息

接著我們來對訊息進行處理。在 OnMessage 中,對 inst 的內容進行判斷:

if "sync" == inst {
    // Sync? Ack!
    Respond(ctx, msgView, "ack")
} else {
    Respond(ctx, msgView, defaultResponse)
}

如果使用者發來的訊息是 sync,那麼就讓機器人回覆 ask;如果不是 sync,則回覆一句預設文字。

回覆的實現在 Respond 函式之中,它非常簡單:

func Respond(ctx context.Context, msgView bot.MessageView, msg string) {
    if err := client.SendPlainText(ctx, msgView, msg); err != nil {
        log.Panicf("Error: %s\n", err)
    }
}

只是呼叫機器人客戶端 client.SendPlainText回覆一句話給對方,回覆的內容由變數 msg 指定。

效果如下:

mixin-bot-tut-0101

這樣,一個能跟你說話的機器人就完成咯。在 OnMessage 中新增更多邏輯,就可以讓它具備更多功能,而不僅僅是回覆一個單詞。


小結

本章內容暫時到這裡,Hello Bot 的 Mixin Id 為 7000101423,可以在 Mixin Messenger 中加它為好友體驗。

Hello Bot 的原始碼可以在 https://github.com/fox-one/hello-bot 獲取。

下一章,我將為 Hello Bot 新增操作資金轉賬的功能。

Mixin Network開發者大賽已經開賽,趕緊參加吧!

本次大賽的目的:基於Mixin Network作為底層搭建出更多優秀並且具有創意的作品。

Mixin Network,一個為所有優質數字貨幣提供閃電網路服務的技術方案。Mixin Network繼承了比特幣的 UTXO 結構,通過組合使用成熟的 aBFT,POS 和 DAG 技術,結合 Intel 硬體簽名機制和高速資料中心實現了超高容量,超快確認,非常安全的分散式記賬網路。

報名官網地址:官網報名入口

本次大賽將面向全球優秀開發者,鼓勵更多開發者基於Mixin開發應用:
如基於Mixin Network的交易解決方案;Mixin Messenger 全幣種錢包的應用,機器人的開發;OceanONE 交易所引擎的使用等,進行不同行業領域產品和方案的創新。

181123大賽廣告750-450.jpg

目前基於Mixin Network開發的產品案例:

聚合數字資產交易和錢包:fox  (https://fox.one/zh/)

日本最大的行情工具類應用:Coinview

開源的加密數字錢包:Mixin Messenger

基於Mixin Messenger建設的小程式案例:

OTC交易小程式:Exin(MixinID:7000101276)

一個簡單好玩的老虎機:Slotin(MixinID:7000101605)

可以發數字貨幣紅包的小程式:價值紅包(MixinID:7000100089)

全球首家只接受數字貨幣的支付線上商城:TokenMall(MixinID:7000101403)

大賽採用全開放式的競賽模式,不設限制性賽題,開發者基於Mixin開發的解決方案都可以參賽。

大賽階段

- 報名開始(2018年11月14日)

- 報名截至(2019年1月3日)

- 作品提交截至(2019年1月4日)

- 獲獎結果(2019年1月10日)

大賽獎金

WX20181114-002316.png

一等獎(1名)獎金等值 30萬元;
二等獎(2名)獎金等值 10萬元;
三等獎(3名)獎金等值 5萬元。
優秀獎(14名):每一個評選的優秀專案獎勵25XIN(價值約25000元)

參賽規則

1、一個參賽團隊最多5人。所有報名團隊成員都視為同意參賽協議

2、報名將於2018年11月14日開始到2019年1月3日23時59分。

3、提交作品程式碼時間為2018年11月14日至2019年1月4日23時59分。截止時間前未提交程式碼的視為放棄比賽。

4、參賽者須基於 Mixin Network 技術平臺進行開發。

5、開發者可以在 Mixin Network 社群自由組隊交流討論,協同創作,將創意變成現實。

6、提交的作品必須包含可執行程式及程式碼。

相關資料: Mixin 官方開發者指引和 API 文件: http://developers.mixin.one/api

Mixin 官方程式碼 :https://github.com/MixinNetwork

Mixin App demo 簡介以及基本概念: https://mixin-network.gitbook.io/mixin-network-cn

嘉賓評委介紹

馮曉東: Mixin Network CEO,曾任職中國最領先的移動視訊技術與服務提供商一下科技技術合夥人。

李林: Mixin Labs 負責人,資深區塊鏈技術專家,全棧工程師,擁有豐富的專案開發和管理經驗。

霍炬: PRESS.one CTO,在科技和網際網路領域有多年開發、架構和團隊管理經驗。

Jeffrey Wernick: Uber, Airbnb早期天使投資人,比特幣的堅定信徒,著名投資者。

Dr. Joseph. Liu :門羅幣演算法提出者,HCASH首席科學家。

Dr. Jiangshan. Yu :2017年4月30日被授予“中國政府優秀博士學者獎”

合作伙伴

WX20181123-183728.png

歡迎報名參加

加入Mixin Network 微信官方群進行了解諮詢;和大佬一起交流開發經驗,賺取高額獎金。

WX20181116-170149.png