...
代码块 |
---|
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() |
...