Alice和Bob已經在他們選擇的資料倉儲中共享資料,而智慧訪問控制著使用者訪問,這些訪問都透過網際網路連結在一起。
Alice和Bob也想下棋。
他們都有屬於自己的棋盤和棋子,他們只需要在資料倉儲中儲存一份移動記錄就行。我們還可以在狀態機中對輪到誰的程式碼進行編碼,使用者可以透過直接呼叫智慧合約來對其進行影響。
國際象棋資料共享示例
本示例旨在為Alice和Bob提供解決方案。所需的任何功能都可以編碼到智慧合約中。
在此示例中,智慧合約可以由任何使用者(智慧合約所有者)建立。可能是Alice、Bob或其他人。
在任何情況下,只有智慧合約所有者可以在合約允許的情況下終止合約。終止的合約將向智慧合約所有者釋放任何剩餘資金,並將刪除資料倉儲。
國際象棋資料共享示例智慧合約的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)可以呼叫完成。
以下是每個角色允許的其他操作:
Object Role State Permitted Operations
contract account1 Await1 done - move to Await2
contract account2 Await1 done - move to Await1
folder3 account1 Await1 read, append new file
folder3 account2 Await2 read, append new file
· 建立智慧合約
這是我們將要部署到以太坊區塊鏈的ChessDataShareSDAC智慧合約:
import "DataShareSDAC.sol";
contract ChessDataShareSDAC is DataShareSDAC {
bool turn2;
constructor( address _account1, address _account2 ) public
DataShareSDAC(_account1, _account2) { }
function getPermissions( address account, uint object )
public view override virtual returns (uint) {
if (!terminated) {
if (object == 3) {
if (account == (turn2 ? account2 : account1)) {
return DIRECTORY | APPEND_PERMISSION;
} else {
return DIRECTORY | READ_PERMISSION;
}
}
}
return DataShareSDAC.getPermissions(account, object);
}
function done() 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")中的這一部分。
· 更新資料倉儲
我們無法更改將哪個智慧合約附加到資料倉儲。這是一個深思熟慮的設計決定。我們認為使用者不太可能願意更改控制其資料的合約。
但是可以編寫一個更復雜的智慧合約,該合約可以更新如下:
但是目前,我們必須建立一個引用新智慧合約的新資料倉儲。
· 建立資料倉儲
建立部分請參考上一篇文章,這裡就不重複操作。
我們可能需要將現有檔案從以前的資料倉儲複製到這個新的,然後終止以前的智慧合約。
無論如何,我們都需要為共享資料夾新增一個新的環境變數。
Smart Contract Owner Terminal
$ export C=folder13
· 使用國際象棋資料共享
設定智慧合約是為了讓Alice首先執行。在指定了自己的舉動之後,Alice必須直接與智慧合約進行通訊,以告知她已經完成了自己的舉動並轉換了機器狀態(使用UML和智慧合約中的操作):
Alice Terminal
$ datona writeVault $contract $vaultUrl $vaultSrvId --file $A/msg10
“Are you Ready for a game? I go first"
$ datona writeVault $contract $vaultUrl $vaultSrvId --file $C/move01
“e4"
$ datona transactContract $contractCode $contract done
這些移動將寫入到folder 3中的檔案中。我們在下面為檔名提供了序號,但是在完整解決方案中將由DApp管理。
Bob Terminal
$ datona writeVault $contract $vaultUrl $vaultSrvId --file $C/move02
“e5"
$ datona transactContract $contractCode $contract done
$ datona writeVault $contract $vaultUrl $vaultSrvId --file $B/msg21
“Your go"
Alice或她的DApp可以監視下一個移動檔案的存在:
Alice Terminal
$ datona readVault $contract $vaultUrl $vaultSrvId --file $C/move02
VaultError - File does not exist
$ datona readVault $contract $vaultUrl $vaultSrvId --file $C/move02
e5
$ datona writeVault $contract $vaultUrl $vaultSrvId --file $C/move03
“Nf3"
$ datona transactContract $contractCode $contract done
遊戲可能會以同樣的方式繼續。
我們上一篇文章中的共享去中心化資料解決方案中的示例描述了資料倉儲上使用者之間的互動,該互動由智慧合約控制。
這個例子還演示了使用者和智慧合約之間的直接互動。