Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WrapperSyscall design #32

Open
mohanson opened this issue Sep 15, 2021 · 0 comments
Open

WrapperSyscall design #32

mohanson opened this issue Sep 15, 2021 · 0 comments

Comments

@mohanson
Copy link
Collaborator

看了一下昨天 debugger meetup 的 slide,想起了一个新需求先提在这边:

godwoken 是一个在链外用 generator 跑 ckb-vm 的场景。我们最近签了一个社区的 grant,也会需要这样一个架构。在这样一个架构里,generator 端的调试,目前是没法用到 debugger 的,上次 godwoken 疑似出 bug 时,也是找到了这边,考虑 LV 组自己跑一个 godwoken 来嵌入调试。后期社区项目启动之后,这种需求可能会更多。所以我们要解决一个问题:如何用 ckb-debugger 来调试像 godwoken 这样,链外用 generator 跑的 ckb-vm?

我之前想到的一个方式,是可以用 syscall wrapper 来解决。

目前 ckb-vm 的 syscall 接口是这样的:

pub struct DefaultMachine<'a, Inner> {
    // ...
    syscalls: Vec<Box<dyn Syscalls<Inner> + 'a>>,
}


我们其实可以设计一个 WapperSyscall:

pub struct WrapperSyscalls<'a> {
    wrapped_syscalls: Vec<Box<dyn Syscalls<Inner> + 'a>>,
}


正常执行流程中,是 DefaultMachine 在 syscalls 里找一个能处理当前 ecall 的 syscall 来跑。

在使用 WrapperSyscall 时,DefaultMachine 的 syscalls 里面只放一个 WrapperSyscall,这个 WrapperSyscall 中包含的 wrapped_syscalls 里面,才放真正的,generator 端的 syscalls。

在实际执行 ecall 时,WrapperSyscall 会做两件事情:

* 记录每个 ecall 执行时,syscall 的 number,以及 a0 - a5 六个参数的值
* 在 wrapper_syscalls 里找一个真正的 syscall 来处理当前 ecall
* 记录下这里面做的所有的写操作,无论是写内存,还是写寄存器

这样在当前执行结束之后,WrapperSyscall 中可以获得当前程序执行过程中,所有执行的 syscall 的参数,以及真正的 syscall 处理时,做的写入操作。有了这些信息之后,其实我们就可以在 debugger 端无限重放当前的合约。让 debugger 可以支持任何用 WrapperSyscall 收集到数据的 ckb-vm 实例。而不需要那个 dumped transaction(在很多 generator 端可能也没有)

Questions? @xjd @mohanson
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant