[教學] 使用地氣 (DiQi) 區塊鏈 API,發行自己的虛擬貨幣

自從去年底金管會將法規鬆綁,讓金融機構可以投資資訊服務與相關科技公司後,FinTech 這個詞彙突然在台灣爆紅,成為大家熱烈討論的議題。不管是 P2P 借貸,第三方支付,拆帳付款,區塊鏈技術等等這些應用,都屬於 FinTech 的範圍,強調的是科技與金融兩者跨領域結合的創新,提供新樣態的服務,顛覆傳統金融體系。

我正巧搭上這股列車,在這學期修了廖世偉老師的 2B 課程 (區塊鏈與巨量資料),接觸金融科技領域的最新資訊,也把使用 DiQi API 的心得記錄下來,希望幫助更多使用者。


區塊鏈技術

說到 FinTech,最常談到的就是區塊鏈 (Blockchain),而這個詞彙如同雲端運算、物聯網、機器學習一樣,拜技術成熟之賜,在相應的時間點能以快速發展。或許大家對區塊鏈還算陌生,不過應該有聽過比特幣 (Bitcoin) 吧,它是 2008 年一位化名為中本聰的人所提出的技術,發表了一篇 paper,同時也在 2009 年 1 月產生了首批 50 個比特幣。

而比特幣背後就是應用區塊鏈技術,以密碼學的基礎來保障隱私以及交易安全,儘管因為其引隱匿的特性,淪為洗錢的工具,但回歸到區塊鏈的本質,它是一種 Trust machine,正如同銀行 (Trust company) 一樣,希望存放的財物能夠受到相對應的保障,是基於信任關係建立起來的一套制度。

為了符合這樣的需要,區塊鏈擁有了五種特性,分別為:安全、不可竄改、隱私性、智能合約、共識演算法。根據以上五種特性,我們可以應用在不同的環境下,例如倉儲管理、供應鏈金融、信用評價等等,有非常大的發展空間

更詳細的區塊鏈介紹,可以參考:區塊鏈 - 老師上課筆記


Gcoin 區塊鏈技術

Bitcoin 大家不陌生,但其實還有許多虛擬貨幣例如:GcoinRippleLitecoin…,而這次要跟大家分享的 DiQi 就是基於 Gcoin 這套區塊鏈系統打造出來的 API 服務!Gcoin 是臺灣第一套自行開發的區塊鏈協議,可以在 Github 上找到開放原始碼,與 Bitcoin 不同的地方在於,Gcoin 擁有三大優勢:

  • 效率:改善數度瓶頸,每 15 秒可結算一次
  • 安全:動態難度調整技術解決 Bitcoin 遇到的 51 % 攻擊風險
  • 法規:認許制,能配合金融監管的反洗錢與身份驗證規範

在官方網站上,可以看到這樣的說明:

GCOIN 區塊鏈協議致力於提供一套開放的數位金融基礎建設,使用 GCOIN 可打造出支援兼顧安全性、效率性、低維護成本的交易平台。區塊鏈上的數位化資產能夠與真實世界中的各種資產建立不可竄改的連結,包括點數、票據、證券、權證、甚至房地產等線下資產。GCOIN 將區塊鏈針對金融應用與電子商務所需的交易速度與可擴展性加以改進並優化,可真正實現數位金融的虛實整合。

詳細內容可以參考

3大面向一次搞懂區塊鏈,美國NASDAQ、跨國銀行都搶著用

使用 DiQi

看到那麼多區塊鏈的討論,而且 Github 上就有區塊鏈的 Source Code,想必大家也會想要跑一個 Server,試試看自己挖礦,建立一套私有鏈吧!

網路上有很多教學,當然也可以直接拿 Bitcoin 公有鏈來玩,只是每筆交易都會扣手續費,加上要先有 Bitcoin 呀呀呀,沒錢的學生就是跑跑私有鏈就好,以下有一個教你怎麼建立 Private Bitcoin Network 的教學,他已經把東西包成 Container 了,只要放到 Docker 就可以拿來玩玩。

Private bitcoin network:Creating your own experimental Bitcoin network

我們要做區塊鏈應用的話,就不要重造輪子拉,直接採用現有的區塊鏈 API 來開發。其實網路上有許多相關的服務可以使用,IBM Bluemix 平台上也有提供 Blockchain API (可惜目前正在實驗性階段),因此我選用 DiQi 這套基於 Gcoin 的 API,一來是有圖形化介面可以控管,二來有中文支援,遇到問題時可以在社群上發問,很快就能獲得解決。關於 DiQi 的說明,以下節錄自官網:

DiQi 地氣致力於建立一個開放的虛擬代幣平台,做到安全丶即時丶低手續費的認證交易,虛擬代幣能夠連結真實世界中各種價值與紀錄,例如會員積分或金融產品,真正實現互聯網金融的虛實整合。

 


登入 DiQi 平台

使用 API 之前,我們要先註冊一組帳號,並取得 API 金鑰,同時我們也先瀏覽一下 DiQi 的網頁介面!

備註:平台有兩個網址,https://asset.diqi.us是測試環境,https://platform.diqi.us是正式環境,不過由於正式環境需要經過申請,所以就用測試環境做示範

首先進入DiQi 平台:https://asset.diqi.us/zh/,點選右上角註冊

填寫電子郵件與密碼後,至信箱點取系統認證信即可完成註冊。

登入後可以看到自己的帳戶概況,一開始會有 1000 DiQi 幣,以及一個預設 address (錢包),當然我們也可以透過上面的按鈕發行自己的虛擬貨幣,或是新增其他錢包。在測試環境下,每一筆交易會被扣除 1 DiQi 幣,這樣的設定與 Bitcoin 是相同的,透過手續費的機制,避免遭遇 DDoS 攻擊。此外,錢包的個數上限是 5 個,如果想要新增更多錢包,就需要跟 DiQi 團隊申請了。


發行自己的虛擬貨幣

點選地址 (錢包地址) 旁的發行新資產,就可以發行自己的虛擬貨幣!例如我發行一個 JerryCoin 幣,meta_link 填的是發行商網址,接著填寫簡單說明即可完成。

看到錢包中多了一種幣別 JerryCoin,點選右上角的箭頭->發行更多,就可以來鑄幣囉!

輸入發行數量後按下發行即可,不過新的幣種需要經過審核,要等通過驗證才能發行~


進行轉帳

為了做轉帳示範,我預先開好兩個 address 如下,待會由 address1 轉 10 DiQi 幣至 address2

address1: 1KUjqQnjSTw2gKr4gaj8yCoyNcTKoXRmkB
address2: 1Ha2fPZuWKNZBZ3rjVL3GMXSXqcQbUt8Y2

轉帳前,要先設定支付碼,就跟使用 Line Pay 一樣,轉帳前都要輸入安全密碼。請至左側帳戶資料,點選支付碼相關設定進行設定。

接這我們就可以轉帳拉,請在左側選單選擇轉帳,進入轉帳頁面。 分別填入轉入帳戶 (address2) 以及發送金額,而下方的 #1代表的是轉出帳戶 (address1),按下確認後,系統會要求輸入支付碼,完成轉帳動作。

接著我們可以在交易列表中看見這筆 transaction。左下角我的條碼可以選擇觀看的 address,目前顯示的是我由 #1 (address1) 轉出 10 DiQi 幣至 1Ha2fPZuWKNZBZ3rjVL3GMXSXqcQbUt8Y2 (address2)。

點擊 transaction 可以看見更多詳細資訊,還可以看見交易樹狀圖。

DiQi 平台的使用大致就介紹到這邊,經過圖形化界面操作後應該可以了解整個運作流程了,接著就來使用一下 API 吧!


使用 DiQi API

官方已經有非常詳細的 API 說明書,連結如下

DiQi API:https://asset.diqi.us/static/build/

使用 API 前請先至帳戶資料下的 Developer API Settings,新增一組 API Key 或是 OAuth2 application

以 API Key 為例,可以設定控制的 address 以及權限,接著就會得到一組 Api key 與 Api secret

拿到帳密後,可以根據官方提供的 Python 範例程式做登入測試

我覺得這邊需要注意的是 Timestamp,因為之前使用的 Linux Server 架設在國外,時間並沒有做調整,導致 Request 的時候一直出現 Request timestamp expired…,需要做一下時間校正。

$ sudo ntpdate time.stdtime.gov.tw

總體還說,按造 API 文件上的資料,就可以做到許許多多的事了,只是如果要拿這些 API 來完成自己的應用,勢必要再把他們包成一個API來使用。

以之前參與競賽的例子來說,我們利用 DiQi 建造信用評分系統,分數經過銀行驗證發送,存在用戶的 address上,所以銀行端的 transaction 並不是我們想看到的,所以 API 這邊要做一些過濾,只選定我們要的 address 與 color id (虛擬貨幣代號) 送出。

以下是程式碼片段:

def address(request, addr):
    if request.method == 'GET':
        if addr:
            dm = DiQiManager(addr)
            if(dm.isfound()):      
                diqi_auth = DiQiAPIKeyAuth(dm.key(), dm.secret())
            else:
                return JsonResponse({'error': 'address error'})
            url = "https://asset.diqi.us/api/v1/addresses/" + addr + "/transactions/"
            response = requests.get(url, auth=diqi_auth)
            data = response.json()

            response_data = []

            for tx in data['transactions']:
                flag = False
                edge = {}
                edge['tx_hash'] = tx['tx_hash']
                edge['from_address'] = tx['from_address']
                edge['to_address'] = tx['to_address']
                if addr == tx['from_address']:
                    edge['direct'] = 'out'
                else:
                    edge['direct'] = 'in'
                if 'time' in tx:
                    edge['time'] = tx['time']
                for out in tx['vouts']:
                    if ((out['n'] == 0) and (out['color'] == TrustCoinID)):
                        edge['amount'] = out['amount']
                        flag = True
                if tx['from_address'] == BANK[0] or tx['from_address'] == BANK[1]:
                    flag = False
                if(flag):
                    response_data.append(edge)

            return JsonResponse({'user_data': response_data})
        else:
            return JsonResponse({'error': 'miss transaction id'})
    else:
        return JsonResponse({'error': 'wrong method'})

透過一些處理,網站端存取的時候會更簡潔方便,直接拿到流向以及數量資料。

簡介就到這邊,謝謝大家收看!希望我們都能夠成為改變的一份子,攜手帶動台灣創新的金融發展,改變台灣、改變未來!


參考資料


平時會觀察網路行銷、雲端運算與資訊安全等議題,曾在趨勢科技擔任實習生、 GCP 專門家擔任技術文章寫手,也擔任過 C、JAVA、雲端運算等課程助教。