Mixin 開發簡明教程 1:寫個機器人
我是 @lyric,本教程應 Mixin COO @薄荷 邀約而寫,旨在向區塊鏈領域以外的工程師們介紹如何以依託 Mixin Network,用最簡單的方式開發自己的區塊鏈應用程式。
本文是系列教程的第一篇,如果對本文感興趣,你可以:
- ofollow,noindex" target="_blank">訂閱我的部落格 lyric.im
- 訂閱我的 PRESS.one 專欄
-
關注我的公眾號,搜尋
iamlyricw
- 或在文末給讚賞一些數字貨幣
方便獲取後續更新。
為什麼是 Mixin
從 BTC 到 ETH 到 EOS,相信很多工程師都對區塊鏈有一些瞭解,並對其中的故事有所耳聞。就技術本身,無論是 BitCoin 的基礎技術模型,還是從 ETH 開始智慧合約,抑或是 EOS 獨特的架構——可能讓第一次接觸的工程師會覺得有一些不適應,開發 Dapp 也變得困難。
實際上,每一條公鏈都(聲稱)有自己獨特的應用場景,對此提出了特異性的技術。對於開發者來說,這些涉及複雜密碼學的技術變成了進入門檻。而Mixin 做的事情是抹平了所有公鏈在“交易”這個層面上的差異,專注於“交易”本身 。
在 Mixin Network 中,你可以使用最熟悉的技術棧和協議,輕易地將“數字貨幣”屬性加入到自己的專案中,實現“零售、打賞、貨幣交易”等所有跟“交易”相關的功能;也可以藉助 Mixin Network 的 DAG 網路,將(廣義的)“區塊鏈”屬性加入到自己的專案中,實現“版權、存證、追溯、資訊披露”等所有跟“區塊鏈”相關的功能。
綜上所述,使用 Mixin Network,可以讓你的想法很輕鬆地在區塊鏈上實現,不需要關注很多繁瑣的技術細節。
小貼士
所謂 Dapp,為 Decentralized Application的簡稱。一般認為 Dapp 由智慧合約(即在區塊鏈上運作的程式碼)編寫。
Mixin 對此有不同看法。Mixin 的支持者信仰 Unix 哲學中的 “讓程式只做好一件事”,Mixin 只需要做好“Transaction” 這一件事,因此 Mixin 並不支援智慧合約。這也是為什麼你可以使用自己熟悉的技術棧來寫應用,而不僅僅侷限於少數程式設計語言的原因。
註冊 App
在開始之前,你需要在 Mixin Network 中註冊自己的 App。在 Mixin 開發者中心https://developers.mixin.one/dashboard ,提交圖示、名稱、描述,URL 等基本資訊即可完成註冊。這很類似於常見的開放服務。
註冊完成後,點選 “Click here to generate...” 生產必要的金鑰等資訊,各部分如下圖所示:
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.go
的main
函式中,使用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 UserIdstring // 對方使用者 ID MessageIdstring // 訊息 ID Categorystring // 訊息型別,文字、圖片還是視訊等 Datastring // 訊息的資料,具體的訊息內容 Statusstring // 訊息狀態 Sourcestring CreatedAttime.Time UpdatedAttime.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
指定。
效果如下:
這樣,一個能跟你說話的機器人就完成咯。在OnMessage
中新增更多邏輯,就可以讓它具備更多功能,而不僅僅是回覆一個單詞。
小結
本章內容暫時到這裡,Hello Bot 的 Mixin Id 為7000101423
,可以在 Mixin Messenger 中加它為好友體驗。
Hello Bot 的原始碼可以在https://github.com/fox-one/hello-bot 獲取。
下一篇文章,我將為 Hello Bot 新增操作資金轉賬的功能。
本文的PRESS.one 簽名