蔡明 云峰 阿娜呼 谷仕威 戴梓軒

摘要:由于以第三方交易平臺為中心的擔保交易難以保障擔保資金的安全,該文基于以太坊ERC721區塊鏈技術設計了商品鏈交易結構來存儲商品交易數據,通過追溯商品制造商和擁有者的交易數據來執行假貨鑒別。保障交易數據不可篡改的同時,提高了假貨整別的查詢效率。本文設計了去中心化的擔保機制,基于智能合約ERC721標準化接口,將商品以非同質化Token的形式發布,由于ERC721的性質,每當Token被請求交易的時候都將廣播此條交易信息。由此實現資金轉移流程的不可篡改性,從而保障資金安全。
關鍵詞:區塊鏈;商品溯源;以太坊
中圖分類號:TP3? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2019)25-0246-04
1 區塊鏈的背景及現狀
當下社會,以淘寶京東為首的電商交易平臺以網絡購物足不出戶便能買到各種商場買得到甚至買不到的東西而飛速發展,從最初的不信任網絡交易到現在把網購當作家常便飯,電商極大程度的方便了我們的生活和工作。網購的群體似乎全體默認似的相信這些電商平臺,放心地把資金交給第三方平臺作為和商家的媒介,確認收貨后由第三方將資金轉交給商家,然而事實上這些商家也做得不錯,不然也無法贏得網民的信任。但是這終究是中心化的交易模式,一旦這些平臺出現信譽問題或者內部漏洞,損失將無法避免。
同時存在的一個問題,商品的真假更加難以辨識,在實體店看得到摸得著的商品尚且大多數人都難以辨別真假,透過屏幕和網絡所進行的交易就更加困難。經調查顯示,近半用戶都將商品質量差,為仿制品作為對交易不滿意原因的首選。受限于中心化,各平臺對商品整合能力有限,對商品真假的辨別以及來源的辨別都存在較大的問題,同時一旦中心數據庫遭到攻擊,數據就存在著被篡改刪除的風險。這是中心化存在的另一大問題。
僅僅優化銷售中心對于解決根本問題是杯水車薪,最好的方法就是去中心化,去中心化的交易環境可以提供無須信任的交易模式,可以保障交易數據以及商品來源不可篡改,不需要第三方交易平臺即可實現真正的信任。同時購買商品的顧客可以通過區塊鏈追根溯源找到商品來源,辨別真假。
2008年中本聰最先提出了比特幣的機制,用于存儲比特幣的區塊鏈技術開始在各個領域被廣泛地應用,同樣,在產品追根溯源方面也有著重要的作用。可追溯數據是假貨鑒別的基礎,然而現行傳統的供應鏈可篡改、不透明、節點之間不同步等特性使得數據的可追溯十分困難。而區塊鏈技術不同于傳統的技術,區塊鏈技術憑借工作量證明的共識機制,通過節點之間的算力競爭保證分布式數據的同步,去中心化使得數據不可篡改,賬簿公開,商品的來源更好追溯。
目前有一種常見防偽方式,就是“易損標簽法”,通過簡單的刮刮卡印刷,印上商品唯一查詢編號,用戶通過刮開操作,破損標簽后獲得編號,通過查詢編號或者商品的真偽,系統通過查詢次數記錄反饋給消費者,如果某個標簽被查詢過,可以視為商品被打開過或者是假貨。
另一種防偽方式便是二維碼防偽,二維碼防偽采用二維碼加密技術給產品做標識,將二維碼印刷或標貼于產品包裝上,用戶只需通過指定的二維碼防偽系統或手機軟件進行解碼檢驗,即可驗證產品真偽,獲得詳盡的信息。缺點在于二維碼本身并不能防偽,需要有一個手機APP應用端和企業商品信息數據庫才能實現防偽的效果。原理是通過給每個商品分配一個唯一的二維碼,并運用不可復制的材料印刷技術來確保二維碼不能夠被復制,消費者在購買商品時通過下載手機APP查詢二維碼,核對商品信息、制造企業等信息即可辨別真偽,增加了防偽成本,而且仍然存在造假。
2016年沃爾瑪和清華大學合作,利用區塊鏈技術對食品進行追蹤,銷售給中國消費者,使沃爾瑪在全世界范圍內對食品進行追蹤溯源,快速解決食品不安全問題。目前通過區塊鏈溯源的包括中國的豬肉和美國的包裝產品,這是目前最大型的區塊鏈技術的應用實例。目前一些國家已將區塊鏈技術應用于房屋產權證明領域。
2 區塊鏈相關技術及原理分析
2.1 區塊鏈性質
2.1.1 去中心化
區塊鏈技術是比特幣和加密傳輸的基礎技術,中心問題是解決沒有值得信任的中心化結點的情況下,網絡中各個小節點如何實現相互信任,達成共識。區塊鏈被形象地稱為分布式賬本,原因就在于每一個節點都有著完全相同的所有交易數據,而且沒有中心節點,也就意味著所有的節點都是中心節點,改變其中一個節點的數據并不會被其他節點所承認,除非掌握一半以上的節點,但這是一項龐大的工程,幾乎不可能完成。因此,區塊鏈去中心化的技術很好地解決了信任問題,那就是用算法取代中心。由于不存在中心節點,交易的成本也大幅度降低,促進了交易率的提高。
2.1.2 匿名性
在交易過程中,所有的交易信息都被完全公開,任何用戶都可以查詢所有的交易數據,交易信息完全透明,但是出于隱私要求,用戶賬戶信息并不會被公開,區塊鏈技術有對應的加密算法來完成,將賬戶信息加以保護,未經允許無法訪問。區塊鏈技術的共識機制保證交易記錄真實有效,需要多個節點達成共識才能確保交易記錄真實有效。后續的合約機制當達到特定條件自動執行合約條款。區塊鏈技術中,顧名思義,數據以塊的形式進行存儲,塊塊相連,互相有一定的紐帶關系,下一個區塊保存著上一塊的哈希值,一旦從中刪除或修改某一塊,都會造成不可兼容,因此區塊鏈技術有著很好的不可篡改性。
2.1.3 不可篡改
區塊鏈技術的核心是當前的鏈上所有結點共同維護鏈上存儲的交易信息,交易的基礎是密碼學而不是信任,任何用戶想要交易都不需要經過第三方直接交易。從技術角度來講,所有完成的交易記錄都會串成一條主鏈,包含若干區塊,每個區塊保存交易信息、前一塊的哈希散列值、隨機數,交易信息是交易雙方的交易額、數字簽名等;前一塊的哈希值目的是形成塊之間相互聯系的紐帶,保證不可篡改性;隨機數是交易的核心,所有礦工節點,共同計算這個隨機數,計算成功的就擁有這一塊的記賬權,并在網絡中進行廣播,完成交易。從本質上通俗地說,區塊鏈是一個巨型的所有用戶都參與進去的數據庫,所有參與其中的礦工對節點信息進行驗證來找到正確的區塊進行交易存儲。這個鏈式結構隨著時間的增加而不斷延長,每個參與的節點都有一份完整的備份記錄,這些都是自動完成的。通過區塊鏈技術,當用戶想驗證歷史交易信息或商品溯源時,只要通過基于數據結構的密碼學運算就能找到對應的區塊,驗證產品真偽,驗證來源是否可靠。
2.2 區塊鏈運行機制
2.2.1 智能合約
一種以信息化方式傳播、驗證或者執行合約的計算機協議,能夠允許在沒有第三方的情況下進行可信的交易,并且這些交易是無法被追蹤、同時也是不可逆的。通過 POW 實現了 分布式一致性,同時使用 UTXO 模型 存儲和管理底層數據結構,實現了去中心化的分布式賬本,并且在一定程度上實現了『可編程』這一特點,但是它的腳本機制非常簡單,只是一個基于堆棧式的腳本語言。
2.2.2 非對稱加密
非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那么只有用對應的公開密鑰才能解密。主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)。使用最廣泛的是RSA算法,Elgamal是另一種常用的非對稱加密算法。
2.3 ERC721技術
ERC721是針對不可置換Token的智能合約標準接口,(non-fungile tokens)不可置換Token簡稱NFTs,操作標準API的實現方法。在ERC721標準下生成的token(在本項目中每寫入一件商品相當于生成一個token)具有不可置換,獨一無二的特性,由于這種特性,在每次token交易發生時,系統都會廣播該token交易的雙方以及是哪條token被交易。該特性非常有利于交易追溯。
3 基于區塊鏈的商品交易鏈設計
3.1 商品鏈體系模型
本章主要說明基于區塊鏈的商品交易模式和假貨識別系統的核心技術,并同時建立相應模型。該商品鏈主要涉及的環節有:商品生產環節,商品銷售環節,二手交易環節。主要的關鍵技術:基于ERC721的真偽識別功能,交易擔保。致力于如何完成可追溯源頭的真假鑒別,去中心化的擔保交易。 商品的真偽識別主要分為兩個方面來實現,第一方面為商品的追根溯源,當你查詢一件商品的來源時,可以逆著商品鏈,查詢到這個商品的各級供貨商,也就是這件商品的整個供貨渠道,然后繼續追溯的話可以追溯到這件商品的生產源頭,以及該商品各級原材料的源頭,來確保該商品本質上的安全可靠。第二方面是商品的歸屬性查詢,由于是基于ERC721產生的商品token都具有唯一性,所以該token每次的交易記錄都會被系統廣播,被所有用戶見證交易,所以可以查詢到token 的完整流通路徑,可通過此被見證的路徑驗證其真偽,如果賣家不在該token流通路徑尾端,則可判定為該商品為假。
擔保交易主要通過區塊鏈的去中心化的特性來實現,先編寫智能合約,然后將所有的交易流程通過智能合約的ERC721標準接口來寫入區塊鏈中,這樣就實現了去中心化的交易擔保,可以有效地防止第三方篡改交易內容。
3.2 基于區塊鏈的假貨鑒別
商品的真偽識別主要分為兩個方面來實現,第一方面為商品的追根溯源,當你查詢一件商品的來源時,可以逆著商品鏈,查詢到這個商品的各級供貨商,以及該商品各級原材料的源頭。在ERC721標準下,每次商品token被交易,系統都會廣播交易信息,所以用戶還可以通過自己商品的獨一無二的token來查詢廣播日志來查詢該商品的流通記錄,由于所有廣播都是所有用戶共同見證的,所以該廣播日志也具有不可篡改的性質。這樣就形成了交易鏈及token交易日志雙查詢的雙保險機制,保證了用戶查詢商品真偽的可靠性。第二方面是商品的歸屬性查詢,因為該商品一直在該商品鏈上流通,如果你查詢到商品歸屬權現在不在你的賣家哪里,但他仍出售這件商品,則可判定為該商品為假。因為該技術涉及追溯查詢的效率,應該對該商品鏈的結構進行優化。
3.2.1 比特幣交易結構
比特幣系統是沒有余額的概念的,它使用的是UTXO模型(Unspent Transaction Outputs,未使用過的交易輸出),我們在交易過程中經常說的錢包余額,實際上是一個錢包地址的UTXO集合。所以,在比特幣網絡中,存儲比特幣余額的是交易輸出,準確點說就是未使用過的交易輸出,而每一筆交易的輸入實際上引用的是上一筆交易的輸出。下圖是比特幣系統中交易輸入輸出的過程:
由于比特幣比特幣對賬戶地址和交易地址都做了索引,所以上述操作可以快速地執行,但是在假貨鑒別的背景下,要頻繁的通過商品id來查詢交易記錄,將商品變成比特幣后,比特幣的utxo結構并不能提供快速的查詢操作。由于缺少索引,所以要想完成查詢操作,就要對所有區塊進行遍歷操作,這明顯是不現實的。所以為了能滿足我們高頻查詢的要求,我們要對比特幣交易結構進行一定的改進。
3.2.2 商品鏈交易結構
(1)交易塊:每發生一筆交易,買方就會創建一個交易塊來記錄交易數據。交易塊主要由塊數據(Block Data)和交易流數據(Tx Stream Data)兩部分組成。塊數據用于記錄交易塊的屬性數據,例如該塊記錄的是哪件商品(Product ID)、由哪一個用戶產生(Owner Address)、交易塊的創建時間(Create Time)等;交易流數據用于記錄與交易直接相關的數據,例如該商品的上一擁有者的賬戶地址(Up Owner Address)、下一擁有者的賬戶地址(Down Owner Address)、交易金額(Price)等。
(2)商品鏈:在一件商品完整的生命周期中,每被交易一次,就會產生一個交易塊,把一件商品的所有交易塊按照它的產生順序鏈接起來,就是一條商品鏈。由于該商品鏈記錄了前后交易的信息,所以該商品鏈類似于數據結構中的雙鏈表結構,可以快速方便的追溯生產商的信息,同時也能向尾部追加交易信息。
該商品鏈保留了比特幣交易鏈的通過交易地址查詢交易信息的功能的同時,還可已通過商品的id快速高效的查找出該商品所在鏈,進而查詢出該商品的所有交易方。
塊數據和商品交易流的數據在追尋數據來源和商品所有權是有著至關重要的作用。將商品鏈通過雙鏈表和數組兩種數據結構儲存,在查詢時無論是隨機查詢還是根據某個交易塊來查詢其他交易塊,查詢的效率都很高。通過該商品鏈結合比特幣交易結構的特點和本身的id索引。就可以通過商品id和交易地址快速的定位交易區塊,進而就可進行整條鏈的交易數據查詢。通過這種特殊的結構,就能很高效的在海量商品交易信息中獲取到目標商品的所有交易信息,進而提高假貨查詢的效率。
3.3 擔保交易
本交易體系采用智能合約的形式來代替傳統的第三方平臺擔保。我們的優勢在于,我們可以將擔保交易的仲裁結果與結算規則寫入區塊鏈中,使其獲得不可篡改的特性,這種特性可以使擔保交易的可靠性和安全性大大提高。
3.3.1 擔保交易雙方
在我們的商品鏈中,主要分為兩類用戶,一類為交易用戶,一類為商品制造商。交易用戶可執行除了商品制造的所有操作,包括:定價、付款、發貨時申請 token、確認收貨等操作。而商品制造商的操作有:注冊商品(只有被注冊過的商品才能被交易)
3.3.2 擔保交易流程
擔保交易通過買家付款的操作來激活執行,買家付款的金額暫存在智能合約的合約賬戶中進行擔保,只有符合仲裁和結算的規則時,才會發生資金的轉移,將資金付款給賣家。這樣去信任性的擔保更為安全,可以有效避免人為的惡意操作。
在賣家發貨時,會生成一個隨機的token,該token會和商品一起發送給買家,該token的用途有如下幾條:1.匿名銷售功能,買家可以通過token來驗證商品的真偽,不需要通過賣家的id和地址,所以不會暴露賣家的身份。2. 防止非法用戶銷售商品。在申請 token 時,智能合約會判斷當前商品所有權是否歸屬于當前申請人。由于只有商品的當前擁有者才可申請 token,而非法用戶不具有該身份,導致其無法申請 token。由于缺少正確的 token,買方就可在交易初期識別非法商販,節省交易成本。
在買方確認收貨時,智能合約會進行如下操作:(1)驗證token,判斷商品歸屬權是否為當前賣家。(2)驗證制造商,核實商品來源是否屬實合法。(3)更新交易信息,轉移商品歸屬權。至此,交易完成,如果所有步驟符合智能合約規定,暫存到合約賬戶的金額將會打款給賣家。
3.3.3 擔保交易的仲裁結算模型
模型主要需要解決的問題是交易雙方在發生糾紛時如何進行仲裁和結算的問題。仲裁操作在買家收貨的時候觸發,首先點時器判斷收貨是否超時未執行,若超時后買家未操作,則把在合約賬戶的錢轉入賣家賬戶。如果在期限內進行收貨操作,則合約執行假貨鑒別的流程,如果鑒定結果為假,則把錢退回買家賬戶中,如果鑒定結果為真,則把錢匯入賣家賬戶中,視為交易成功。
4 區塊鏈可信溯源解決方案的設計與實現
在現有區塊鏈的基礎上,本項目基于以太坊智能合約, 實現商品可信溯源,在服務端運用SpringMVC,實現商品溯源查詢,前端運用Javascript通過HTML展示所查詢的結果,智能合約則使用以太坊自己的語言Solidify 將每一件商品信息和ID存在以太坊區塊鏈上。
4.1 開發環境
Windows 10
Geth v1.8.23-
solidity ^0.4.0
4.2 準備工作
(1)安裝Ethereum錢包
(2)Geth安裝,安裝完成后執行 geth help 查看geth的用法
4.3 初始化以太坊
(1)在本地新建genesis.json文件,通過控制臺Geth命令初始化創始區塊
geth init genesis.json
(2)啟動以太坊
geth --rpc --rpcapi personal,db,eth,net,web3 --networkid 666666 --rpccorsdomain ”http://remix.ethereum.org” console
(3)創建錢包,一種是在Ethereum圖形界面創建,一種是通過Geth在控制臺輸入personal.newAccount()創建
(4)解鎖當前賬戶,使私鏈上的賬戶之間可以交易,通過Geth輸入
personal.unlockAccount(eth.accounts[0])
(5)開始挖礦操作,保證數據存在每一個區塊鏈結點。
miner.start(1)
4.4 部署智能合約
以太坊官方推薦的智能合約開發語言為Solidify,目前嘗試Solidify編程最好的方式是使用Remix。Remix是基于瀏覽器的Solidify IDE,它集成了Solidify編譯器、運行環境,以及調試和發布工具。使用瀏覽器打開網站https://remix.ethereum.org/,即可編寫智能合約代碼。
(1)編寫智能合約代碼
function register(address addr, string? username, string password) public {
}
(2)點擊Compile標簽頁的Details,然后找到web3deploy將寫好的合約部署到本地私鏈上。
var addorsearchContract = ;
var addorsearch = addorsearchContract.new(
{
from: web3.eth.accounts[0],
data:
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
(3)將RemixIDE生產的代碼拷貝到geth控制臺(注意:挖礦不能停),按下回車鍵運行就可以部署合約了。合約部署成功會有提示,
Contract mined! Address:0x9d77720ad98139952b33ff7de812957af811b09f
4.5 Java開發
使用maven管理 利用web3j庫進行開發
4.6 服務端開發
使用SpringMVC在Web端實現查詢注冊功能
4.6.1 追溯產品的制造商
根據伴隨該商品的唯一ID,擁有查詢權限查詢方通過前端可以追溯到商品鏈鏈首來查詢該商品的信息。
輸入:productID,name
輸出:companyInfo
4.6.2 判斷查詢方是否有權限查詢商品的制造商
鑒別假貨要通過追溯商品的制造信息和商品的所有權信息來判斷商品的銷售信息是否屬實。追溯商品制造商時,部分用戶可能會隱藏商品的來源。為了保護用戶的隱私,商品擁有者才有權限查詢商品制造商的信息。
輸入:商品唯一ID 和 商品品牌
輸出:查詢方是否有權限。
4.6.3 追溯商品的所有權
根據該商品的商品鏈,擁有查詢權限查詢方可以追溯到商品鏈鏈尾來查詢該商品的所有權。
4.6.4 通過商品token追溯商品的交易流通記錄
根據商品注冊時根據ERC721標準產生的商品唯一token,該token擁有者可查詢改商品的所有交易記錄。
輸入:商品token和用戶id
輸出:該token交易記錄
4.6.5 生產方和交易方
用戶的身份信息以合約UserContract的方式來實現。生產方注冊時需要填寫company字段,而交易方則無需填寫此字段。
4.6.6 擔保交易流程
商品交易的相關操作以BlockContract交易塊的形式管理。交易塊由塊數據和交易流數據兩部分組成。塊數據包含了交易塊的基本屬性,交易流數據包含了交易相關的數據。商品交易狀態有OnSale(銷售中),OffSale(未銷售)和Abort(廢棄)。商品交易前,生產方需要注冊其生產的商品。
生產商完成商品信息的注冊后,此商品的商品鏈就被創建完成,便可以交易了。交易中,賣方需要對其商品定價,并將商品的交易狀態改為OnSale。
買方付款時,所付金額不能低于賣方定價,否則交易失敗。若買方成功付款,將其金額暫存到智能合約中進行擔保。只有交易正常結束后,擔保資金才會支付給賣方。
買方付完款后,賣方需發貨,在發貨時會隨機生成一個獨一無二的token。
4.6.7 仲裁和結算
買方收到商品和token后,便可以確認收貨。為了防止買方不主動發起確認收貨,而影響正常交易的完成,在買方收貨后,會觸發定時器,若在規定時間買方未確認收貨,智能能合約中的擔保資金會因超時轉至賣方。
部分代碼:
@Controller
public class UserController {
@RequestMapping("login")
@ResponseBody
public boolean login(HttpServletRequest request, HttpServletResponse response) throws Exception {
}
5 總結
本文主要以區塊鏈技術和供應鏈為研究背景,基于以太坊區塊鏈技術設計了可追溯供應鏈和去中心化的交易體系。提出了一種基于ERC721區塊鏈技術的去中心化供應鏈交易體系,將每一個商品賦予一個非同質化的token,將供應鏈交易所產生的交易數據存儲于區塊鏈中,同時該token廣播交易日志的存在,可雙重保障交易數據的可追湖性和不可篡改性,在此基礎上通過對商品制造商和擁有者的追溯和追蹤實現了假貨鑒別。同時,本交易體系使用智能合的代替了傳統第三方交易平臺來進行交易擔保,該去信任化機制更可地保護了交易資金的安全。
參考文獻:
[1] 陳西蒙. 基于區塊鏈的供應鏈交易和假貨鑒別的關鍵技術研究[D].華南理工大學,2018.
[2] 鄧偉. 商業銀行視閾下區塊鏈技術的應用分析[D].首都經濟貿易大學,2017.
[3] 郭珊珊. 供應鏈的可信溯源查詢在區塊鏈上的實現[D].大連海事大學,2017.
【通聯編輯:代影】