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

use wazero, and introduce an abstraction for the virtual macine #582

Draft
wants to merge 18 commits into
base: main
Choose a base branch
from

Conversation

faddat
Copy link
Contributor

@faddat faddat commented Dec 19, 2024

what?

To ensure that contracts can run reliably without stopping chains, we shall endeavor to swap out wasmer for wazero. Wasmer is a great wasm vm written in rust, a great programming language. Wazero is a great wasmvm written in go, a great programming language. Both languages get spicy around interop, so it is best to code an entire blockchain application in just one programming language. Additionally, Go memory management breaks when using cgo to import C.

why?

Because cgo doesn't work all that well, and messes up some basic features of Go. Also, similar ABI issues and c interop issues on the rust side, so it is probably not a good idea to use cgo / unsafe in go / unsafe in rust on >40 production networks, even if we are just accounting for the extreme increase in random explosions cause by cgo. But in fact we will be able to reduce explosions in many other ways too.

How?

  • Clean up wasmvm

    • lint
    • clarify structure
  • Create an interface for runtimes so that the runtime interface is clear

  • implement wazero in the runtime folder

  • implement the

whats the trick?

The trick is that cosmwasm's vm package is imported by libwasmvm and provides a lot of functions. We will need to recreate that for wazero and use the host functions feature.

there's a pretty clear migration path to wazero insrtead of wasmer in wasmvm.

When I began to work on cosmwasgo, I made a design mistake and made things less modular.

Today, I began to go through all of the code file by file, and I was able to get to a pretty good place. I still need to reconcile your last commit though.

Although I have hardcoded the runtime, I think you can see how using the runtime folder and the runtime interface allows for a pretty singificant simplification of wasmvm.

There are still remaining questions around gas metering, and a few other things.

cheers!

-Jacob

Note: even if you do not reveiw or merge this, I would appreciate not closing it. Among other things I am using the PR to compare.

Random notes that I will add to as I go:

  • the code inside libwasmvm folder defines interfaces for contracts. It needs to be reimplemented in go using wazero.
  • I'm going one by one through libwasmvm/* and setting that up in Go
    • TestAnalyzeCode done
    • TestStoreCode done
    • Memory management (memory.rs) is now in memory.go
    • Various db methods added to the host
  • This way, we will no longer need a huge binary blob to run cosmwasm contracts in chains using go, and performance and reliability will be improved.
  • It's possible that this may enable us to just use the SDK's gas meter
  • This pull request updates none of the tests. The goal is to ensure that this code passes every single test used by the wasmer version, without exception.

@faddat faddat changed the title merged chaos use wazero, and intraoduce an abstraction for the virtual macine Dec 19, 2024
@faddat faddat marked this pull request as draft December 20, 2024 07:06
@faddat faddat changed the title use wazero, and intraoduce an abstraction for the virtual macine use wazero, and introduce an abstraction for the virtual macine Dec 20, 2024
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

Successfully merging this pull request may close these issues.

1 participant