版本比较

密钥

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

代码块
module rooch_demo::movecraft {
     use rooch::state_channel::{Self, StateChannel};
     
     const ERR_FILE_NOT_EXISTS: u64 = 5;
     
     public entry fun land_settlement<ChatGroup>(account: &signer, state_channel_id: u64, proposal_id: u64) {
          let world = state_channel::get_label(state_channel_id, "world_address");
          
          let land_session = world_borrow_land_session(state_channel_id);
          let settlement_cap = land_session.settlement_cap;
          
          let land = state_channel::borrow_mut<Land>(account, settlement_cap, state_channel_id);
          let settlement_action = state_channel::execute_proposal(state_channel_id, proposal_id)
          let change_sets = state_channel::get_account_change_sets(settlement_action, @rooch_demo)
          
          if table::contains(change_sets, "rooch_demo::chat::Land") {
              let op = table::borrow_mut(change_sets, "rooch_demo::chat::Land");
              land_apply_op(land, op)
          }
     }
     
     fun land_apply_op(land: &mut Land, cs: op::OP<vector<u8>>) {
         if (op::is_modify(cs)) {
             let modify_data = op::modify(cs)
             land_update(land, modify_data)
         } 
     }
}

2、P2P Node

2.1 模块图

...

源文件

2.2

...

Stream模块

Steam模块,维护和SDK的双向流连接。

2.2.1 加入状态通道

命令:state_channel.join

...

参数

类型

描述

sender

string

用户钱包地址

state_channel_id

string

状态通道ID

错误码:

错误码

描述

100001

状态通道不存在

2.2.3

...

调用状态通道合约函数

命令:state_channel.call

参数:

参数

类型

描述

sender

string

用户钱包地址

state_channel_id

string

状态通道ID

function

string

函数名称

ty_args

[]string

泛型参数

args

[]string

参数

...

参数

类型

描述

sender

string

用户钱包地址

state_channel_id

string

状态通道ID

错误码:

错误码

描述

100001

状态通道不存在

返回值:

状态通道状态的快照。

2.3 状态通道

状态通道模块,负责状态通道的创建和关闭。

2.3.1 Controller

状态通道控制器,负责协调其他模块完成状态通道功能。

2.3.1.1 初始化状态通道

业务逻辑:

当状态通道不存在时,调用状态通道合约接口,获取合约详细信息,检查 自己是不是 Leader ,

...

当用户调用合约时,判断自己是否为Leader, 如果为Leader, 在本地执行合约调用,将结果广播给其他Peers, 然后保存到本地Store. 如果自己不是Leader, 将合约调用转发给Leader.

2.3.1.5 处理状态订阅

业务逻辑:

当用户请求订阅状态时,从本地获取快照返回给调用方,同时从快照高度开始从本地Store获取交易,在MoveVM中执行,并将执行产生的状态变更发送给调用方。当从Leader接受到新的交易时,在MoveVM中运行,和Leader的结果对比,如果相同,则将变更转发给调用方,如果不相同发起举报投票。当用户请求订阅状态时,从本地获取快照返回给调用方,同时从快照高度开始从本地Store获取交易,在MoveVM中执行,并将执行产生的状态变更发送给调用方,如果已经运行过,直接返回状态变更。当从Leader接受到新的交易时,在MoveVM中运行,和Leader的结果对比,如果相同,则将变更转发给调用方,如果不相同发起举报投票。

2.3.2 MoveSandbox

MoveSandbox负责运行状态通道中的合约,生成新的状态变更,同时提供状态订阅功能。

...

代码块
import { WasmFs } from '@wasmer/wasmfs'
import { MoveSandbox } from '@starcoin/move-js'

const initSandbox = async () => {
    const wasmfs = new WasmFs()
    const sandbox = new MoveSandbox(wasmfs, {
      storage_dir: "/workspace/storage_dir",
    })
    
    await sandbox.setModules(modules)const accounts = await load_accounts_from_chain(state_channel_id);
    await sandbox.setResourcessetAccounts(resourcesaccounts);
    
    return sandbox
}

initSandbox()

...

代码块
import { WasmFs } from '@wasmer/wasmfs'
import { MoveSandbox } from '@starcoin/move-js'

const executeTransation = async () => {
    const sandbox = initSandbox(modules, resources)
    let change_sets, events = await sandbox.run("0x1::Token::Token", ty_args, args)
    console.log(change_sets)
    console.log(events)
}

executeTransation()

...