如何在区块链上实现去中心化数据仓库共享-part2

本文提供了一个在Solidity中共享去中心化数据的示例解决方案,Solidity是以太坊区块链的智能合约开发语言。

背景

上一篇文章区块链研究实验室|如何在区块链上实现去中心化数据仓库共享-part1,下面是一个使用Datona的交互式命令行界面(datona-cli)的示例解决方案。

Alice和Bob将在自己选择的数据仓库中共享他们的数据,并通过智能合约控制用户访问,所有这些都通过互联网链接在一起。

如何在区块链上实现去中心化数据仓库共享-part2

使用智能合约来控制对数据仓库的访问

这不仅是一个智能合约,它还是一个智能数据访问合约。

数据共享示例

这个例子旨在为Alice和Bob提供一个解决方案。所需的任何功能都可以编码到智能合约中。

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

在任何时候只有智能合约所有者可以在合约允许的情况下终止合约。终止的合约将向智能合约所有者释放任何剩余资金,并将删除数据仓库。


如何在区块链上实现去中心化数据仓库共享-part2

某些对象允许用户访问,但其他对象禁止用户访问

上图中两个用户Alice和Bob可以分别将数据读和写到数据保管库中自己的文件夹中。他们还可以从其他用户的文件夹中读取邮件,但不能写入该文件夹。

合约所有者(除Alice或Bob以外)无法访问任何人的数据。

我们将在终端窗口中使用datona-cli命令来:

1. 部署合约
2. 创建数据仓库
3. 并执行对象操作

也可以使用应用程序与Datona库(datona-lib)进行交互。智能合约以Solidity编写并部署在以太坊区块链上。

数据仓库服务器地址是datonavault.com。其他数据仓库也可用。

· 智能合约设计

我们将account1和folder1分配给Alice,将account2和folder2分配给Bob。

这是智能合约的UML逻辑状态机图:

如何在区块链上实现去中心化数据仓库共享-part2

数据共享示例智能合约的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

· 创建数据仓库


如何在区块链上实现去中心化数据仓库共享-part2

让我们配置数据仓库的访问,然后我们将能够如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在数据仓库上的交互操作。


如何在区块链上实现去中心化数据仓库共享-part2

数据仓库通过智能合约检查用户请求是否被允许

在某个阶段,智能合约所有者可以终止合约,并且数据保管库将被自动删除。

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

· 另一个示例解决方案

我们将在共享去中心化数据时使用datona-cli为这个问题提供另一个扩展的工作解决方案。

结论

Alice和Bob以及其他许多人都希望能够以分散的方式共享数据。这可能会使数据更安全、更私密、更可控。

我们已经展示了一个实用的解决方案,它使用智能合约和数据仓库的组合来实现这一点,这些都符合datona-lib中描述的接口规范。

关键词: 区块链  去中心化数据  

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/28824

联系我们

aliyinhang@gmail.com