自從去年底金管會將法規鬆綁,讓金融機構可以投資資訊服務與相關科技公司後,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 官方網站:https://diqi.us/?lang=zh-tw

DiQi Demo影片:臺大金融科技區塊鏈中心 帳聯網實作 Demo

Gcoin與DiQi的Google討論社群:https://groups.google.com/forum/#!forum/gcoins


登入DiQi平台

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

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

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

diqi1

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

diqi2

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

d3


發行自己的虛擬貨幣

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

d33

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

d4

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

d5


進行轉帳

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

address1: 1KUjqQnjSTw2gKr4gaj8yCoyNcTKoXRmkB

address2: 1Ha2fPZuWKNZBZ3rjVL3GMXSXqcQbUt8Y2

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

d8

接這我們就可以轉帳拉,請在左側選單選擇轉帳,進入轉帳頁面。

分別填入轉入帳戶(address2)以及發送金額,而下方的#1代表的是轉出帳戶(address1),按下確認後,系統會要求輸入支付碼,完成轉帳動作。

d6

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

p9

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

d10

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


使用DiQi API

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

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

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

d11

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

d12

拿到帳密後,可以根據官方提供的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'})

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

d13

簡介就到這邊,謝謝大家收看~~

希望我們都能夠成為改變的一份子,攜手帶動台灣創新的金融發展,改變台灣、改變未來!


參考資料