區塊鏈研究實驗室|如何在區塊鏈上實現去中心化資料倉儲共享-part3

買賣虛擬貨幣

本文提供了在Solidity中共享分散資料的另一個示例解決方案,Solidity是以太坊區塊鏈的智慧合約的開發語言。

背景

Alice和Bob已經在他們選擇的資料倉儲中共享資料,而智慧訪問控制著使用者訪問,這些訪問都透過網際網路連結在一起。

Alice和Bob也想下棋。

他們都有屬於自己的棋盤和棋子,他們只需要在資料倉儲中儲存一份移動記錄就行。我們還可以在狀態機中對輪到誰的程式碼進行編碼,使用者可以透過直接呼叫智慧合約來對其進行影響。

國際象棋資料共享示例

本示例旨在為Alice和Bob提供解決方案。所需的任何功能都可以編碼到智慧合約中。

在此示例中,智慧合約可以由任何使用者(智慧合約所有者)建立。可能是Alice、Bob或其他人。

在任何情況下,只有智慧合約所有者可以在合約允許的情況下終止合約。終止的合約將向智慧合約所有者釋放任何剩餘資金,並將刪除資料倉儲。

某些物件允許使用者訪問,而其他物件則禁止使用者訪問

上圖中,兩個使用者Alice和Bob可以分別將資料讀和寫到資料保管庫中自己的資料夾中。他們還可以從其他使用者的資料夾中讀取郵件,但不能寫入該資料夾。

如果不是合約所有者(如果不是Alice或Bob)無法訪問任何人的資料。

使用者還可以將一個包含棋子移動的新檔案附加到上圖中的共享資料夾-3中。

設計

我們將account1和folder1分配給Alice,將account2和folder2分配給Bob。

我們將國際象棋移動檔案記錄在folder3中。每個使用者可以依次新增一個新檔案。

這是智慧合約的UML邏輯狀態機圖:

國際象棋資料共享示例智慧合約的UML邏輯狀態機圖

這裡我們有3個併發狀態機:合約所有者可以隨時終止智慧合約;資料可以像[如何在區塊鏈上實現去中心化資料倉儲共享-part2](http://bitoken.world/wp-admin/post.php?post=2134&action=edit "如何在區塊鏈上實現去中心化資料倉儲共享-part2")中那樣共享資料。使用者輪流將國際象棋移動檔案附加到folder3(Await1和Await2機器狀態)。

資料倉儲使用圖表中資料共享部分中顯示的函式來確定對物件的允許操作。

圖中wait部分顯示的done函式是一個使用者函式。僅當指定使用者輪到該使用者時,它才能成功使用,這取決於機器狀態。在Await1狀態下,只有account1(Alice)可以呼叫完成。在Await2狀態下,只有account2(Bob)可以呼叫完成。

以下是每個角色允許的其他操作:

ObjectRoleStatePermittedOperationscontractaccount1Await1done-movetoAwait2contractaccount2Await1done-movetoAwait1folder3account1Await1read,appendnewfilefolder3account2Await2read,appendnewfile

建立智慧合約

這是我們將要部署到以太坊區塊鏈的ChessDataShareSDAC智慧合約:

import"DataShareSDAC.sol";contractChessDataShareSDACisDataShareSDAC{boolturn2;constructor(address_account1,address_account2)publicDataShareSDAC(_account1,_account2){}functiongetPermissions(addressaccount,uintobject)publicviewoverridevirtualreturns(uint){if(!terminated){if(object==3){if(account==(turn2?account2:account1)){returnDIRECTORY|APPEND_PERMISSION;}else{returnDIRECTORY|READ_PERMISSION;}}}returnDataShareSDAC.getPermissions(account,object);}functiondone()public{require(msg.sender==(turn2?account2:account1));turn2=msg.sender==account1;}}

此智慧合約包含一個函式getPermissions,該函式重寫基類中同名的函式。呼叫此函式,並可以選擇是否呼叫基類函式。它會這樣做,而不是確定新棋步資料夾(物件3)的訪問許可權。

done函式可由任一使用者(實際上,任何以太坊使用者)呼叫。但是,它確保只有輪到使用者才能更改機器狀態,並透過require(msg.sender == turn)防止其他任何使用者。該函式使turn2變數指示它是另一位使用者的回合。

部署智慧合約

請參閱[如何在區塊鏈上實現去中心化資料倉儲共享-part2](http://bitoken.world/wp-admin/post.php?post=2134&action=edit "如何在區塊鏈上實現去中心化資料倉儲共享-part2")中的這一部分。

更新資料倉儲

我們無法更改將哪個智慧合約附加到資料倉儲。這是一個深思熟慮的設計決定。我們認為使用者不太可能願意更改控制其資料的合約。

但是可以編寫一個更復雜的智慧合約,該合約可以更新如下:

但是目前,我們必須建立一個引用新智慧合約的新資料倉儲。

建立資料倉儲

建立部分請參考上一篇文章,這裡就不重複操作。

我們可能需要將現有檔案從以前的資料倉儲複製到這個新的,然後終止以前的智慧合約。

無論如何,我們都需要為共享資料夾新增一個新的環境變數。

SmartContractOwnerTerminal$exportC=folder13

使用國際象棋資料共享

設定智慧合約是為了讓Alice首先執行。在指定了自己的舉動之後,Alice必須直接與智慧合約進行通訊,以告知她已經完成了自己的舉動並轉換了機器狀態(使用UML和智慧合約中的操作):

AliceTerminal$datonawriteVault$contract$vaultUrl$vaultSrvId--file$A/msg10“AreyouReadyforagame?Igofirst"$datonawriteVault$contract$vaultUrl$vaultSrvId--file$C/move01“e4"$datonatransactContract$contractCode$contractdone

這些移動將寫入到folder 3中的檔案中。我們在下面為檔名提供了序號,但是在完整解決方案中將由DApp管理。

BobTerminal$datonawriteVault$contract$vaultUrl$vaultSrvId--file$C/move02“e5"$datonatransactContract$contractCode$contractdone$datonawriteVault$contract$vaultUrl$vaultSrvId--file$B/msg21“Yourgo"

Alice或她的DApp可以監視下一個移動檔案的存在:

AliceTerminal$datonareadVault$contract$vaultUrl$vaultSrvId--file$C/move02VaultError-Filedoesnotexist$datonareadVault$contract$vaultUrl$vaultSrvId--file$C/move02e5$datonawriteVault$contract$vaultUrl$vaultSrvId--file$C/move03“Nf3"$datonatransactContract$contractCode$contractdone

遊戲可能會以同樣的方式繼續。

我們上一篇文章中的共享去中心化資料解決方案中的示例描述了資料倉儲上使用者之間的互動,該互動由智慧合約控制。

這個例子還演示了使用者和智慧合約之間的直接互動。

智慧合約功能可供使用者和資料儲存庫使用

結論

Alice和Bob以及其他許多人都希望能夠以分散的方式共享資料。這可能會使資料更安全、更私密、更可控。

我們已經展示了一個實用的解決方案,它使用智慧合約和資料倉儲的組合來實現這一點,這些都符合datona-lib中描述的介面規範。

--------------------------------------------

原文作者:Julian Goddard

譯者:鏈三豐

譯文出處:http://bitoken.world

---------------------------------------------

相關文章閱讀:

區塊鏈研究實驗室|如何在區塊鏈上實現去中心化資料倉儲共享-part1

區塊鏈研究實驗室|如何在區塊鏈上實現去中心化資料倉儲共享-part2

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;