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

買賣虛擬貨幣
本文提供了一個在Solidity中共享去中心化資料的示例解決方案,Solidity是以太坊區塊鏈的智慧合約開發語言。背景上一篇文章區塊鏈研究實驗室|如何在區塊鏈上實現去中心化資料倉儲共享-part1,下面是一個使用Datona的互動式命令列介面(datona-cli)的示例解決方案。

Alice和Bob將在自己選擇的資料倉儲中共享他們的資料,並透過智慧合約控制使用者訪問,所有這些都透過網際網路連結在一起。

使用智慧合約來控制對資料倉儲的訪問

這不僅是一個智慧合約,它還是一個智慧資料訪問合約。

資料共享示例

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

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

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

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

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

合約所有者(除Alice或Bob以外)無法訪問任何人的資料。

我們將在終端視窗中使用datona-cli命令來:

1. 部署合約
2. 建立資料倉儲
3. 並執行物件操作

也可以使用應用程式與Datona庫(datona-lib)進行互動。智慧合約以Solidity編寫並部署在以太坊區塊鏈上。

資料倉儲伺服器地址是datonavault.com。其他資料倉儲也可用。

· 智慧合約設計

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

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

資料共享示例智慧合約的UML邏輯狀態機圖
本例中只有一種操作狀態:資料共享,這將使實現相對容易。通常智慧合約必須處理多個狀態。

除了Terminate(終止)之外,顯示的所有函式都由datavault用於確定對物件的允許操作。本例中沒有使用者函式。

終止只能由智慧合約所有者使用。終止是一種邏輯狀態。這與刪除智慧合約不同。終止後,仍然可以訪問合同並確定其是否已終止。

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

Object    Role       State   Permitted Operations
contract  owner      Share   terminate
folder1   account1   Share   all file (read, write, append)
folder1   account2   Share   read directory, file
folder2   account2   Share   all file (read, write, append)
folder2   account1   Share   read directory, file

· 建立智慧合約

這是我們將要部署到以太坊區塊鏈的Solidity DataShareSDAC:

import "SDACinterface.sol";
contract DataShareSDAC is SDACinterface {
    address public owner = msg.sender;
    address account1;
    address account2;
    bool terminated;

    constructor( address _account1, address _account2 ) public {
        account1 = _account1;
        account2 = _account2;
    }
    function terminate() public override {
        require( msg.sender == owner );
        terminated = true;
    }
    function hasExpired() public view override returns (bool) {
        return terminated;
    }
    function getPermissions( address account, uint object ) 
    public view override virtual returns (uint) {
        if (!terminated) {
            if (account == account1) {
                if (object == 1) return DIRECTORY | ALL_PERMISSIONS;
                if (object == 2) return DIRECTORY | READ_PERMISSION;
            }
            if (account == account2) {
                if (object == 2) return DIRECTORY | ALL_PERMISSIONS;
                if (object == 1) return DIRECTORY | READ_PERMISSION;
            }
        }
        return NO_PERMISSIONS;
    }
}

此智慧合約符合datona-lib描述的智慧資料訪問合約介面規範,並在SDACinterface基礎智慧合約(也包含普通物件許可權常量)中實現為虛擬函式。

虛擬函式必須由派生的智慧合約定義(using override),以啟用與資料保險庫的互動。在編寫本文時,函式是terminate、hasExpired和getPermissions,但是請注意如果你的計劃與示例不同,請查閱datona-lib獲取最新規範幫助。

datavault操作由getPermissions控制,getPermissions返回給定帳戶和物件的適當屬性(IsDirectory、Readable、Writeable、Appendable)。

· 部署智慧合約

在Remix,Byzantium v0.6.10中編譯Solidity程式碼。

建立一個檔案DataShare.sdac,其中包含智慧合約ABI,Bytecode和runtimeBytecode,格式與Datona Duration_SDAC示例的相似:

                            DataShare.sdac
{
“abi”: 
  <Copy Remix / SOLIDITY COMPILER / ABI text for the DataShareSDAC
   Contract here>
,
“bytecode”:
  <Copy Remix / SOLIDITY COMPILER / Compilation Details / BYTECODE
   for the DataShareSDAC Contract here>
,
“runtimeBytecode”:
  <Copy Remix / SOLIDITY COMPILER / Compilation Details / RUNTIME
   BYTECODE for the DataShareSDAC Contract here>
}

按照datona-cli中的示例,我們可以將合約部署到以太坊區塊鏈。

在終端視窗中,我們將為Alice和Bob生成一些金鑰,並以智慧合約所有者的身份單獨存在:

    Smart Contract Owner Terminal
$ datona generateKey AliceKey
$ Alice=`datona getAddress AliceKey`
$ datona generateKey BobKey
$ Bob=`datona getAddress BobKey`
$ # provide key funds as described in the datona-cli example
$ contractCode=DataShare.sdac
$ datona deployContract $contractCode $Alice $Bob --key owner
0x3E68B5B74073993f7220cfB851B9B0d3af8444d8
$ contract=0x3E68B5B74073993f7220cfB851B9B0d3af8444d8

· 建立資料倉儲

讓我們配置資料倉儲的訪問,然後我們將能夠如datona-cli中所述建立資料倉儲:

    Smart Contract Owner Terminal
$ vaultUrl=file://77.68.75.133:8127
$ vaultSrvId=0x288b32F2653C1d72043d240A7F938a114Ab69584
$ datona createVault $contract $vaultUrl $vaultSrvId --key owner
... responseType: 'success' ...
$ export A=folder1
$ export B=folder2

有關實際的資料夾名稱格式,請參見Daytona自述檔案。

· 使用資料共享

我們可以以Alice身份開啟終端視窗,然後將資料寫入資料倉儲:

          Alice Terminal
$ export DATONA_KEY=AliceKey
$ datona writeVault $contract $vaultUrl $vaultSrvId --file $A/msg01
         “Hi Bob, from Alice"

這將寫入資料夾名稱“ $ A”,檔名“ msg01”,內容“ Hi Bob,from Alice”。

我們不必費心在下面的終端輸出中顯示responseType:“success”訊息。

讓我們為Bob開啟一個終端視窗,並列出檔名和檔案資料,然後響應:

Bob Terminal
$ export DATONA_KEY=BobKey
$ datona readVault $contract $vaultUrl $vaultSrvId --file $A
msg01
$ datona readVault $contract $vaultUrl $vaultSrvId --file $A/msg01
Hi Bob, from Alice
$ datona writeVault $contract $vaultUrl $vaultSrvId --file $B/info
         “Hi Alice, from Bob”
$ datona writeVault $contract $vaultUrl $vaultSrvId — file $B/invite
         “Coffee?”

Alice可以列出檔名,然後列出檔案資料:

           Alice Terminal
$ datona readVault $contract $vaultUrl $vaultSrvId --file $B
info
invite
$ datona readVault $contract $vaultUrl $vaultSrvId --file $B/info
Hi Alice, from Bob
$ datona readVault $contract $vaultUrl $vaultSrvId --file $B/invite
Coffee?

對話可以繼續,並且可以傳送和接收資料檔案。

本節說明了由智慧合約控制的Alice和Bob在資料倉儲上的互動操作。

資料倉儲透過智慧合約檢查使用者請求是否被允許

在某個階段,智慧合約所有者可以終止合約,並且資料保管庫將被自動刪除。

   Smart Contract Owner Terminal
$ datona terminateContract $contractCode $contract --key owner

· 另一個示例解決方案

我們將在共享去中心化資料時使用datona-cli為這個問題提供另一個擴充套件的工作解決方案。

結論

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

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

免責聲明:

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

推荐阅读

;