[Golang][LINE][教學] 將你的 chatbot 透過 account link 連接你的服務

(圖片來自: LINE Developer Document: Link user account )

前言

經營有成的電子商務網站,如果想要透過 LINE 官方帳號( OA: Official Account) 與聊天機器人來觸及更多使用者應該要怎麼做呢? 你要如何透過安全又有效的方式來串連網站與 OA 的互動呢?

這篇文章將介紹 LINE account binding,透過 account binding 可以讓你的 chatbot 了解面對的使用者身份。並且透過綁定帳號的方式來提供使用者一制化的體驗。並且透過一個範例來讓你更容易快速建置出來。

範例程式碼

https://github.com/kkdai/line-account-link

如何部署範例程式碼:

  • LINE Developer Console 建立相關的 Provider 跟 Channel

  • 建立一個 [email protected] 並且打開 MessageAPI 的功能,並且將以下兩個資訊記住:

    • Channel Secret
    • Channel Token
  • 到 https://github.com/kkdai/line-account-link 按下 Heroku Deploy ,建立該帳號並且部署該服務。這時候會要輸入三個資訊:

    • LINECORP_PLATFORM_CHANNEL_CHANNELSECRET
    • LINECORP_PLATFORM_CHANNEL_CHANNELTOKEN
    • LINECORP_PLATFORM_CHANNEL_SERVERURL
      • 這個資訊根據你的 heroku app 名稱來決定,假設你的 Heroku app 名稱叫做 test-api-1234 那麼你就該填 https://test-api-1234.herokuapp.com/
  • 記得把 https://test-api-1234.herokuapp.com/callback 加到 LINE chatbot web hook 才能正確地啟動聊天機器人。

範例應用場景

這個範例想要表的是一家電子商務公司有 三個使用者 (ID: 11, 22, 33) 也都有相關的身份資料在該電子商務網站。而這個聊天機器人可以展示如何透過 LINE account binding 來串連你的使用者與聊天機器人。

整個場景都流程分成以下幾個步驟:

  • 使用者加入電子商務的官方帳號 。
  • 在官方帳號選單的聊天機器人視窗中,選擇“帳號綁定” (link)。
  • 連線到該電子商務網站,輸入原本已經有的帳號跟密碼。
  • 確認帳號訊息無誤後,倒回聊天機器人並且進行帳號綁定。

實際跑一個範例

  • 先 Deploy 該範例專案,或是直接加入測試機器人 @yzy8635g (也可以掃描以下 QR Code)
  • 加入帳號後 ,輸入任何字串都是會顯示帳號尚未綁定。你可以連到該商業網站顯示帳號 (list) 或是直接開始綁定帳號 (account link)

  • 按下 “list” 會傳回顯示所有使用者的網址.按下 “link” 則顯示登入頁面開始登入。

  • 到了登入網頁,就輸入該商業網站的帳號跟密碼。 這個範例程式裡面是 11, pw11 (假定使用者叫做 Paul)
  • 登入成功之後,就會收到 chatbot 回報帳號綁定成功。把綁定帳號網頁關閉即可。(要做得更好,可以透過 LIFF 來做 account binding 就可以自動關閉網頁)
  • 回到聊天機器人,這時候帳號就顯示綁定完成。表示 chatbot 能夠將你與商業網站的使用者連接一起。 chatbot 也就已經將使用者 Paul 的帳號綁定。

流程圖與程式碼解釋

根據以上的流程圖,稍微說明一下每個角色代表的意義:

  • User:
    • 就是指的是 LINE 上面的用戶。
  • Provider’s bot server:
    • 這邊指的就是該商業服務的 LINE 官方帳號的聊天機器人伺服器。
  • Provider’s web server:
    • 這個就是該商業服務的網站伺服器,如果是購物網站就是該購物網站的後台伺服器。
  • LINE Platform:
    • 這個就是指 LINE 平台的資料處理系統。

了解每個角色代表的意義之後,我們開始解釋每個流程所代表的意思.通常在 Account Link 發生的時候,商業網站的官方帳號會發送一個「是否要連接你的 LINE 帳號與商業網站?」的請求.當使用者同意之後,才會啟動以下的相關步驟:

  1. 官方帳號的 LINE bot 會對 LINE 平台發送一個該使用者要求 account link 的 token 請求。

  2. 如果請求資料正確, LINE 平台就會回覆一個 token 。

    res, err := bot.IssueLinkToken(userID).Do() 這樣可以透過該使用者帳號直接 issue token

  3. 官方帳號的 LINE bot 透過取得的 token 跟 LINE 平台請求將兩個資料做連接。

  4. LINE 平台會傳回一個網址,讓使用者透過該網址來做資料的連接。

    這邊就傳回 該網站的 /link以這個作為鏈結的網址。

  5. 使用者連線到該網址(這裡通常是透過 LINE bot 直接送出 URL scheme 讓使用者點選導向該網頁).請注意這個網址會是直接連接到商業網站之中。

  6. 顯示該商業網站的登入畫面,讓使用者登入該綱頁網站。

  7. 使用者在商業服務平台輸入了自己的登入資訊。

  8. 商業服務平台透過使用者的帳號資訊產生了一個隨機數 (nounce)。

    雖然說 nounce 為隨機數,其實有產生的規則與限制

    • 使用 secure random number generator
    • 建議透過 base64 encode
  9. 商業服務平台將使用者導向到 LINE 平台的 account-linking 的進入點。

  10. 使用者讀取 account-linking 進去點,並且將商業服務平台的隨機數帶進去。

  11. LINE 平台傳回同一組隨機數與使用者 ID (UID) 到商業服務平台的 webhook 用來作為綁定之用。

  12. LINE bot 這時候收到該隨機數 (nounce) 的認證,透過這個隨機數 (nounce) 將使用者在 LINE 上面的身份與商業服務平台帳號取得綁定。

    也就是最後要將這些資訊傳回給 Server ,作為綁定成功地確認https://access.line.me/dialog/bot/accountLink?linkToken={link token}&nonce={nonce}

  13. 這時候 chatbot 會收到 EventTypeAccountLink 的 event 並且透過結果可以知道該使用者綁定成功。 nounce 也會提供給你作為帳號比對的資訊。

為何要使用 Account Link

透過 account link 可以讓 chatbot 裡面的使用者與原先商業網站的帳號相互的綁定。透過的機制就是一開始 issue link token 並且在登入成功後將 token 帶回到 chatbot 裡面,並且透過產生的 nounce 可以確保雙方資料的無誤與正確性。 整體來說,使用 account link 具有以下的優點:

  • 步驟簡單:透過 IssueLinkToken 與 API call 即可完成整個綁定流程。
  • 安全:透過改使用者申請的 token 才能夠作為 accountLink 的回傳 token ,可以確保手續完整性。

什麼樣的情況會需要使用 Account Link

這個部分將會討論,什麼樣的情況下會需要使用 account link:

  • 已經有大量的使用者族群在原有的商業網站上面
  • chatbot 需要綁定原有的使用者資訊

總結

對於已經有相當量使用者的服務提供商而言,透過 account link 可以讓 chatbot 的使用者與原有服務的帳號資訊綁定,讓使用者有著一致的服務體驗。方法上也相當簡單,希望透過這個範例可以讓開發者更容易了解整個流程與概念。

參考

  • https://developers.line.biz/en/docs/messaging-api/linking-accounts/
  • https://github.com/kkdai/line-account-link

[Golang][LINE][教學] 如何傳送 LINE 專屬的表情符號(emoji)

前言

大家都知道 LINE 有一些自己獨特的表情符號(而非一般的 emoji) ,如果真的想要在 chatbot 中來顯示表情符號其實沒有那麼簡單。剛好發現其實網路上的資源也不多,順便寫一下相關資料分享給大家。

顯示一般的表情符號 (Emoji)

⚽️ 🏀 🏈 ⚾️ 🏐 🏉 🎾

如果要顯示 emoji ,其實他的代碼可以直接複製。這裡有兩種方式可以顯示。

  • 直接將 emoji 複製起來,貼到字串裡面即可 str := 🍆 即可

如果要顯示完整 emoji 列表可以去這裡找

如果要透過 Golang 來顯示,可以透過以下的程式碼:

關於 LINE 自訂的表情符號

首先要先解釋一下, 一般來說如果要在官方帳號(OA) 上面直接發送具有 LINE 特定的表情符號可以透過以下方式。

\uDBC0\uDC84  

這一段代表的就是顯示熊大的表情符號。但是你會發現不論你如何顯示都無法正常顯示。

經過尋找過後,發現以下的 issue 已提醒相關的資料。Python LINE SDK discussion

裡面有提到兩件重要的事情:

  • LINE Emoji 是自定義的,要參考 LINE Emoji document
  • 透過另外一個討論 Java LINE SDK discussion ,會發現 LINE Emoji 需要透過 utf32 來轉換到 utf8 。 (因為 Golang 本身都是透過 utf8 來處理字串)

所以處理方式如下:

  • 透過 LINE Emoji document 來查表,找尋需要的 熊大 Brown 表情 0x100084
  • 由於是 32 位元,前面補零 0x00100084
  • 產生 utf32 decoder
  • 轉換 utf32 成 utf8

那就直接來看程式碼:

參考

[好書分享] 跟TED學說故事,感動全世界

  • 跟TED學說故事,感動全世界 - 好故事是你最強大的人生資產
  • The Storyteller’s Secret
  • 作者:卡曼.蓋洛
  • 原文作者:Carmine Gallo
  • 譯者:許恬寧
  • 出版社:先覺出版
  • 出版日期:2016/07/01

書籍網址: https://readmoo.com/book/210058386000101

前言:

跟著前一篇文章[好書分享] 跟TED學表達,讓世界記住你之後,這一本書相當推薦在讀完前篇文章之後繼續閱讀。也就是說如果說前一本書能讓你打破觀念,開始了解一個好的演講需要的一些要素。那麼這本書就是要讓你好好開始學習講一個好故事,講一個真誠的故事,講一個令人深刻的故事。

內容簡介:

這本書的主軸由二十四篇充滿著故事性的演講(可能不全是 TED) 開始提起,讓你了解每一篇所具有的說故事技巧。

第一部 那些點燃我們內心火焰的說故事大師

裡面先提到故事最重要的一些元素,不是誇張不是精彩,而是夠真實。這邊也不斷的建議我們,許多感動人心能夠連接講者與聽眾的故事往往就是講者自己的故事。這一段引用不少知名人士的演講,從搖滾樂天王史汀,星巴克的創始人到傳教的牧師。大家能了解這些人一站出來就能夠吸引每個聽眾的目光,但是讓感動內心的往往就是他們真實的過往故事,他們如何遇到困境,加以突破最後變成現在令人稱羨英雄的故事。

第二部 那些啟迪我們的說故事大師

第二段就是要提到故事往往要能「夠簡單」,透過故事本身的用字遣詞。這邊提到一個很重要的概念就是,就算你的故事內容與脈絡很好,你還需要不段的修飾故事本身的文字。讓故事說出來的時候,平易近人任何人都能輕鬆地閱讀並且了解。

這邊舉了比爾蓋茲在演講台上直接喝大便過濾的水,來讓大家注意並且打破了所謂「聽眾的安全堡壘」讓故事本身深刻的烙印在聽眾的心理。而哈洛威爾醫生透過比喻的方式來解釋「注意力不足過動症」(ADHD),讓每個聽眾就算沒有任何醫學的背景也能夠快速地了解。

第三部 那些一針見血的說故事大師

第三段開始要教導講者,你要能夠濃縮你的故事。如果你的演講無法改成一句話,一段文字或是三十秒的小故事。你的演講主軸真的需要好好的重新思考。

這邊有提到幾個有趣的例子:特斯拉的馬斯克用了很短的一句話敘述了現在世界上電池的缺點。太空人如何用短短的一個小故事與幾張圖片來讓你了解恐懼。如何透過明信片短短的區域來解釋你的生意點子獲得投資。

第四部 那些激勵人心的說故事大師

激勵人心的說故事大師往往都能夠讓他的故事具有靈魂,讓故事的本身變成演講的主軸。

跨國旅館的老闆透過自己的故事來激勵每一個員工,並且希望員工都能夠尋找自己的故事。因為故事的本身就代表著良好的服務,貼近人並且感動人心。讓每個來訪的顧客都能夠賓至如歸。

失去雙腳的講者敘述著自己原本快樂的生活,經歷了失去雙腳的巨變,如何調整自己並且擁抱全世界。

這些都是故事應該具有的靈魂。

第五部 那些啟動改造時刻的說故事大師

這裡首先都就提到了金恩博士,他如何透過「我有一個夢…」的起頭,來串接所有想法並且形成了跨世代的偉大演講。原本在講稿裡面並沒有那句話的,而這些被認為像是即席加入的幾個文字卻構成了最重要的元素。

這些可能都是不斷練習的結果,大家都聽過一萬個小時。除了不斷練習能帶來的熟練度之外,還能夠帶來敏銳的直覺能了解如何讓故事本身變得不朽經典的小技巧。

說故事大師的拿手絕活:

■告訴別人故事之前,先重新打造你告訴自己的故事。 ■給聽眾能認同的英雄,告訴大家他們克服了什麼困難,以及最後的收穫。 ■簡報至少要有65%是故事。 ■數據與事實雖能說服聽眾,但唯有動人的故事能讓大家起立鼓掌。 ■提供有用的細節,讓故事更豐富。 ■堅守三數法則。 ■皮克斯七步驟,給聽眾可以歡呼加油的對象。

◎特別收錄1:24個故事QRcode即掃即聽! ◎特別收錄2:故事大師的百寶箱、故事力檢測表,三秒鐘立即吸收全菁華!

心得:

這本書除了讓你聽過一次那些偉大的故事本身外,透過頗析故事架構與共同的元素可以讓人快速地了解並且不斷的精進自己的故事。這本書的許多小技巧都相當能夠幫助你思考故事在演講中的比重,重新給予原本可能只是小插曲的故事新的靈魂。

透過這本書的閱讀之後,我重新了解故事對於一段演講的重要。必須得說也由於這樣的原因使得原本看似簡單的故事現在都要好好的思考整個故事架構與內容,務必力求完美。講師在講解的時候其實也大多依照著這本書的架構來教導。

記得第一次剛看完的時候,就決定將自己的演講分成兩段故事來表達。但是卻無法完整抓到故事給予人的連貫感與深刻程度,使得整個演講排練相當的糟糕。也只能說雖然說故事的能力是天生的,但是如何將故事說得好說得深刻說的動人,真的是需要持之以恆的練習。

[好書分享] 跟TED學表達,讓世界記住你

  • 跟TED學表達,讓世界記住你 - 用更有說服力的方式行銷你和你的構想
  • Talk Like TED : The 9 Public Speaking Secrets of the World’s Top Minds
  • 作者:卡曼.蓋洛
  • 原文作者:Carmine Gallo
  • 譯者:羅雅萱、劉怡女
  • 出版社:先覺出版
  • 出版日期:2014/05/29

書籍網址: https://readmoo.com/book/210034405000101

前言:

最近即將在年底的大活動來講比較軟性的題目。公司提供很好的福利給來分享的講者適當的訓練 ,為了能夠更了解,特地去買了電子書閱讀器 (readmoo),也買了一堆電子書來好好閱讀。

記得曾經聽誰說過『越硬的內容,講起來越軟(代表簡單);而越軟的內容,講起來越硬(代表很難)』,所以開始不斷的閱讀一些如何說出一個好演講的書籍。有兩本其實相當推薦。這是其中一本,另外一本是「跟TED學說故事,感動全世界」。

此外,為何說「越硬的內容越好講?」因為越艱深的內容,最重要的課題是要講的「淺顯易懂」這樣就已經成功了八成,只要在中間再加上一點點笑話,就是一場完美的演講。 但是軟性的演講是需要聽眾 call for action 的,更是因為每一張投影片可能都相當的容易了解。所以要能講到內心深處就格外的困難。要能夠讓聽眾感同身受,並且像是受到佈道般的激動感受。

內容簡介:

這是一本精心挑選了很多傑出的 TED 演講的書籍,並且詳細的解讀了每一個成功的演講背後的原因。

以下幾個是擷取出來的推薦,也是我最喜歡的幾個章節之一。

▍羅賓森爵士如何幽默的談教育,使他的談話成為迄今最受歡迎的TED演說,勝過許多名人? POINT!關鍵的第一步聽起來可能違反我們的直覺──別企圖表現得很幽默!帶有幽默感的敏銳觀察,才是最恰當,也最有效的。

▍比爾‧蓋茲為什麼要把蚊子帶上TED講台,是什麼原因讓他的演講5年後依然被討論? POINT!在演說中加入令聽眾瞠目結舌的橋段,那麼這段教他們難以忘懷的演說就能緊緊抓住他們的注意力,並且在演說結束後仍久久不忘。

▍發現鐵達尼號的深海探險家巴拉德,如何在18分鐘內讓人們重新認識海洋? POINT!告訴聽眾一些他們從來沒聽過的資訊,並且以別出心裁的方式來包裝這些資訊;或針對行之有年的老問題提出新鮮、新奇的解決之道。

心得:

這是一本相當好的書籍,雖然整本書都是以介紹 TED 的成功演講為案例。但是非常清楚地解釋了每一段演講成功的原因,並且有附上相關演講的 QR code 。 雖然之前有一段時間我中午都是邊吃飯邊看 TED ,但是裡面還是有相當多段影片是我沒有看過的。

首先推薦的就是羅賓森爵士這段 TED 史上點擊率最高的演講,真的是相當的幽默風趣。讓每個聽的人都會會心一笑之外,也會認真的思考教育本質的問題。就如同他一直說的,「如果你的演講不有趣,就不會有人聽你說話。」再來我也很推薦比爾蓋茲的思路,首先透過不斷的清楚堆砌故事來深入人心之後。最後透過放蚊子的方式來打破每個人的防禦心,讓故事深刻的打到每個人的心理。

相當推薦這本書可以給以下兩種人:

  • 如果你很喜歡看 TED 的演講影片,但是不知道哪幾篇是最受歡迎的。可以來看看這本分析,會讓你欣賞精彩的演講之外,深刻的了解許多背後的用意。
  • 如果你跟我一樣,有一個機會要講比較軟性的演講。也很推薦你先從這一本看起,因為他會先開始讓你有學習的動機。先從欣賞一場好演講開始。

[Golang][LINE][教學] 如何快速建置一個 LINE Notify 的服務

前言

LINE 在 2017 年其實推出了一個「通知」的服務,名稱為 「LINE Notify」.這個服務跟 LINE Bot 裡面的推送(Push Message) 其實是分開來的,而且服務也是需要另外申請的.

本篇文章將簡單的介紹這個機制運作的方式,並且暨「[Golang][教學] 在 Heroku 建立你自己的 LINE 機器人 (LINE Bot API)」 之後,在寫一個 LINE Notify Template 的服務. 讓各位可以快速部署出自己的 LINE Notify 的服務.

LINE Notify

LINE Notify 的申請頁面 跟 LINE Bot 的不同,建議各位可以先去申請 Github 或是 IFTTT 的服務.

你會發現有一個新的帳號加你為好友,千萬不能封鎖 不然所有的 LINE Notify 都會收不到.

如果你可以正常的串接 Github 或是 IFTTT 的 Line Notify ,我們就可以繼續以下的相關工作.

開發 LINE Notify 服務

講到要如何開發一個 LINE Notify 的服務,主要需要進行以下幾件事情:

  • LINE Notify 的申請頁面 註冊你將要啟動的服務,來取得 Client IDClient Secret
  • 一個靜態網頁來負責開啟 POST 資訊到 LINE Notify 並且讓使用者在 LINE Notify 上面登入帳號與傳送相關資訊
  • 開發一個 API 端口(auth)負責跑 LINE Notify oauth 來讓使用者的 LINE 帳號與 Line Notify 的服務器登陸服務
  • 開發另一個端口(callback)來接收,傳送回來的 token 並且儲存作為之後通知之用
  • 最後有一個發送通知的端口(或是服務器透過資訊變更而啟動) 的端口 (notify) ,負責將要更新的資訊傳送給 LINE Notify 服務器來轉發到 Line Noty 的帳號上

在服務的說明上,可以參考 Line Notify 的官方網頁 或是 Poy Chang 所寫的「實作 Line Notify 通知服務 (1)」 都相當清楚. 但是本篇文章是希望能快速帶領各位完成一個 LINE Notify 的服務,所以接下來會使用我所開發的 LINE notify repo 來介紹.

透過 Line Notify Template 快速建立服務

Line Notify Template Repo: https://github.com/kkdai/linenotify

接下來的文章,將會一個個來解釋該如何透過 LINE Notify Template 來快速進行開發:

申請一個 Line Notify 服務:

記得到這個網址來申請你需要的 LINE Notify 服務,關於網址的部分可以先隨便輸入.稍後服務建立起來後再申請.

建立好服務後,記得將兩個重要資訊抄錄下來 Client IDClient Secret:

透過 Heroku Deploy 快速搭建出已經建立好的 LINE Notify Template

這裡會先假設各位都已經有 Heroku 帳號 ,接下來各位到這個 repo

LINE Notify Template Repo: https://github.com/kkdai/linenotify

點下 「 Deploy to Heroku 」來將這個服務部署到你自己的 Heroku 伺服器(不需要花費)

這時候會需要輸入 App Name 代表你服務的名稱與網址請隨意輸入.但是稍後要記錄起來.

範例裡面我們將輸入 test-linenotify ,區域就沒有差別. (這個名稱是 unique ,請勿跟我一樣 XD )

然後到 Setting Tab 去打開 Reveal Config Vars 加入以下的參數:

  • CallbackURL:
    • 這裡需要輸入你 App 網址,假設你 app 叫做 test-linenotify 那麼網址就會是 https://test-linenotify.herokuapp.com/callback
  • ClientID:
    • 輸入 Client ID 從 Line Notify 註冊頁面所取得的資料
  • ClientSecret:
    • 一樣,輸入 Client Secret 從 Line Notify 註冊頁面取得的資料

回到 Line Notify 服務頁面來修改相關資料:

你需要回到當初設定的服務網址去修改相關網址.依照以下方式來修改:

  • 服務網址:
    • 依照這個範例, https://test-linenotify.herokuapp.com/auth
  • Callback URL:
    • 依照這個範例, https://test-linenotify.herokuapp.com/callback

就這樣.. 全部設定完成.

如何使用 LINE Notify Template 來測試:

根據這個範例,你需要到這個網址 https://test-linenotify.herokuapp.com/auth

你會看到一個按鈕,這個時候你可以按下連接到 Line Notify按鈕 , 他會要求你登入 Line 的服務然後連接到以下的網頁.

這時候建議選擇 「透過 1 對 1 聊天接收通知」,然後就會導到一個成功的網頁.

並且在 Line Notify 會出現以下綁定成功的訊息.

發送測試 LINE Notify 訊息吧

由於這個範例程式不具備資料儲存的功能(他也只會記住前一次登陸的 token ),所以建議連動成功之後馬上就開始測試.

根據這個範例,你可以馬上輸入 https://test-linenotify.herokuapp.com/notify?msg=test1 這個指令是會傳送文字 test1 到你的 Line Notify 去.然後你就會看到以下資料.

未來的工作:

這個範例只是讓各位能夠快速了解 LINE Notify 運作的原理與一個服務需要哪些 API .但是離正式上線還有許多功能要做,如果你要開發一個正式的服務,可能需要以下相關服務.

  • 更詳細的服務登入網頁:
    • 需要一個更清楚的網頁讓使用者知道明瞭,該 LINE Notify 是提供哪些服務.
  • 資料庫來儲存所有的使用者 Token:
    • 要傳送給相關使用者,你需要一個清單來記住所有註冊的使用者 token .
    • 由於 Heroku 並不提供資料庫功能,而這個範例程式也只有存在記憶體中. 也就是隨時會被改調或是因為 Heroku 進行每天六個小時的停機而清除掉.
  • 更好的內容提供:
    • 飯粒提供的內容相當簡單,只是一個 Query String 來傳送資料.正常狀況可能是監控一系列的機器,或是做網路爬蟲等等相關工作.
    • 身為服務提供商,需要定期抓取資料並且決定要不要送給使用者(或是送給哪位使用者)

參考

  • https://notify-bot.line.me/doc/en/
  • https://poychang.github.io/line-notify-1-basic/
  • https://mr117119.wordpress.com/2017/08/15/line-notify-line-%E6%8F%90%E4%BE%9B%E7%9A%84%E5%85%8D%E8%B2%BB%E9%80%9A%E7%9F%A5%E6%9C%8D%E5%8B%99/

[Coursera] Blockchain Basics

課程鏈結: 這裡

前言:

最近開始決定來清理一下 Coursera 上面積欠的課程,但是也想到竟然有這幾天的假期,不如來好好的學習一些有趣的知識. Ethereum 就是一個我之前一直想好好學習,但是沒有時間可以了解的. 剛好看到 Coursera 也有相關的課程,所以決定把這個系列課程剛好這幾天學習了解.

「Blockchain Basics」 算是比較粗淺的入門課程,並沒有任何的 Programming 的部分,主要是做概念的講解與名次的解釋.

課程內容:

Week1:

基本的 Blockchain 結構:

UTXO

UTXO(Unspent Transaction Output): 結構包含如下

  • Unique identifier of the transaction that created the UTXO
  • Index
  • Value
  • (option): Condition under output can be spent

一個 Transaction 會有 Input UTXO 也會有 Output UTXO,

Genesis Block

Genesis Block 指的是第一筆的交易,不論是 Bitcoin 或是 Ethereum 都有他們的 Block #0 ,我們可以透過以下的工具來查看:

  • Block Explorer: https://blockexplorer.com/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
    • 具有 1 個 transaction
    • Reward: 50
    • Difficulty: 1
    • 時間: 2009 (如果你那時候開始玩.. )
  • EtherScan: https://etherscan.io/block/0
    • 具有 8893 個 transactions
    • 0 個 contract
    • Gas: 5
    • Reward: 5

Week2:

Smart Contracts:

Smart contracts 是透過類似 Solidity 的高階程式語言,寫成一段程式碼可以透過 EVM (Ethereum Virtual Machine) 跑在任何的 ethereum client 上面.

Ethereum 貨幣單位

交易產生 Smart Contracts 流程:

每一筆交易可以帶有可執行的程式碼 (smart contracts) ,但是執行該 Smart Contracts 的算力(Gas) 會被反映到手續費裡面.並且有嚴格的 Gas Limit 來掌控一個 Block 所能使用的上限.

節點功用:

  • Full node:
    • 交易的啟動,認證
    • 挖礦
    • 區塊的建立
    • 智能合約的執行
  • Minor node:
    • 接收,驗證並且執行交易

Gas Point:

Gas Point 是給所有節點為了執行 Smart Contract 的手續費,計算範例如下:

  • Step: 1
  • Load from memory: 20
  • Store into memory: 100
  • Transaction base fee: 21000
  • Contract creation: 53000

如果 Gas Point 不夠或是消耗完了,該筆交易就會被取消.

Mining incentive model

Prove of work puzzle winner 拿到所有的 Block reward ,但是緊接在後面的 miner 叫做 Ommer miner .而它們挖出來的 Block 也會放著作為 Security check 之死,並且拿到一小筆的 reward.

Ethereum Accounts:

  • EOA(Externally owned account): 透過一組 PK (private key) 來代表你是帳號擁有者,並且可以執行相關操作.
  • Contract: 透過相關 smart contract 的 code 來控制的帳號.

Block creation sequence

  • 交易開始
  • 交易認證 (Validation)
  • 交易綁定與廣播
  • PoW 解決 Puzzle
  • 增加新的 Block 到鍊上

Refer: Life cycle of ethereum transaction

Week 3:

ECC (Elliptic curve cryptographyphy)

Strong than RSA,

256 bits ECC key pair ~= 3072 bits RSA key pair 

Hash function

  • Simple Hashing:
    • Fixed number of items (block header)
  • Tree hashing:
    • Number of items differ from block to block

All hashing output:

  • Account address
  • Digital signiatures
  • State hash
  • Receipt hash

如何保證 block 的一致性 (Integrity)

  • 不可串改的 block header
  • Transaction 不可被串改
  • State 的移轉是透過計算Hash 編碼並且認證過的

Bitcoin 與 Ethereum 都是透過 SHA-3 演算法 Keccak 來作加密

Bitcoin 如何計算這個 block 的 hash value? 需要以下資訊:

  • Previous block hash
  • Version
  • Merkle Root Hash
  • Timestamp
  • Bits
  • Nonce

參考網址: https://cse.buffalo.edu/blockchain/blockhash.html

Ethereum Merkle Tree

用來作用比對交易的一致性 (integrity), leaf node 存放交易(transaction)的資料. Parent node 則存放該子結點的 Hash Value. 而 Root node 存放所有交易的 Hash Value. 這樣做的好處有:

  • 一致性檢查: 所有的 Hash value 環環相扣,不容易被人輕易修改.
  • 修改少: 如果一筆交易有修改,要修改得資料只有由這個子結點一路到 root node

參考:

  • https://www.youtube.com/watch?v=h1wzzhkHfTk
  • https://bitcoin.stackexchange.com/questions/10479/what-is-the-merkle-root

Week4:

Trust Trail flow:

  • 驗證Transaction
  • 驗證 gas 跟 資源(resources)
  • 選擇一群交易 (transactions) 來建立新的 block
  • 執行該 Transaction 來取得新的狀態 (state)
  • 建置一個新 block
  • 通過 consensus 驗證
  • 將 block 加入到 chain 的最尾端

Consensus of blockchain

  • https://www.coindesk.com/short-guide-blockchain-consensus-protocols/
  • https://blog.wavesplatform.com/review-of-blockchain-consensus-mechanisms-f575afae38f2

Double Spending

  • 指的是有兩個 block 在非常接近的時間產生出來.這樣的話兩個 block 會同時連接到 main chain 產生兩條 chain . 但是之後比較長的 子鍊 會取代成為主鍊

  • Ethereum 透過 Global nonce 跟 account number 來解決這樣的問題.

PoW v.s. PoS

這段影片很簡單扼要

簡單記錄一下:

  • Proof -of-Work: (Bitcoin, Ethereum ( 主鍊))
    • Miner 透過消耗算力來解開 puzzle ,驗證是否為適合的 block.
    • Miner 得到相對應的 reward
    • 風險:
      • 51% 攻擊,當有人能夠集結 51% 以上的算力的時候就可以偽造資料,修改 main chain
  • Proof-of-Stake: (目前用在 Ethereum testnet)
    • 所有總資產一開始就存在,而每筆交易需要手續費(賭注)
    • 沒有人負責 mine block 而是作為 validate block
    • 每個人都可以附上一筆手續費來提升自己被選為下一個 block 的費用(賭注)
    • 風險:
      • 只要有人能夠拿出 51% 的錢當手續費,就有機會攻擊.這部分有更多論文正在討論.

Forks:

  • Soft fork: Software patch
  • Hard fork: Protocol change which introduce two chain could not merged.

Soft-fork in Bitcoin

Bitcoin 有過一次 Soft-fork for P2SH Script ( pay-to-script-hash script) refer here https://bitcoin.org/en/developer-guide#p2sh-scripts

Hard-fork in Ethereum (Ethereum Homestead –> Ethereum Metropolis)

包括了以下的 EIP (Ethereum Improvement Proposal):

  • Parallel processing of transactions
  • Proof-Of-Works consesnsus still stay except that every hundren blocks, Proof-of-stake consensus protocol is applied for evaluating latter.
  • Miner incentive was reduce from 5 Ethers to 3 Ethers.

Final Course Project

最後的作業,會讓你跑一個本地端的 VM 內建已經安裝好的 Ethereum client (geth) .並且跑一系列動作新建節點,連線,挖礦,交易.簡單但是可以馬上感受到 Ethereum 的完整感受.

Reference:

  • http://www.takethiscourse.net/blockchain-online-courses-moocs/
  • https://medium.com/blockchannel/life-cycle-of-an-ethereum-transaction-e5c66bae0f6e
  • https://github.com/ethereum/wiki/wiki/Ethereum-Development-Tutorial
  • https://cse.buffalo.edu/blockchain/blockhash.html
  • https://medium.com/@fukuball