gnolang / hackerspace

Tinker, build, explore Gno - without the monorepo!
7 stars 4 forks source link

State / merkle tree visualizer #11

Open moul opened 1 year ago

moul commented 1 year ago

I remember such amazing tools developed in the IPFS ecosystem to visualize merkle trees and CIDs in general. It was both useful for educational purpose but also for debugging.

Feel free to share existing projects that we could potentially adapt for our case.

Personally, I’d love something working in CLIs.

moul commented 1 year ago

Cc @ajnavarro

ajnavarro commented 1 year ago

@moul I think you might be referring to https://dag.ipfs.tech/ , right?

I love CLIs too, and the best Merkle tree visualizer I know is the git log command: Screenshot from 2023-06-15 10-17-20

Also, Merkle trees can be represented in a lot of different ways, ones are better for specific use cases. What do we want to show on that Merkle tree representation?

moul commented 1 year ago

Not sure, but maybe visualizing the state evolution at the end of execution or through an indexer could greatly aid in contract debugging and discovering new usages.

moul commented 1 year ago

cc @ilgooz do you have something similar in mind for Gno Studio?

ajnavarro commented 1 year ago

Maybe a crazy idea, but we can represent the realm states as a table and make queries filling a lot of different use cases:

These are some of the possible tables that we can have:

Functions Table

Field Name Type Value Example
package string gno.land/r/my/package
height number 23
name string Render
params json {"name":"Render", "type":"string"}
results json {"name": "_", "type": "string"}

State Table

Field Name Type Value Example
package string gno.land/r/my/package
height number 23
var_name string gBoards
var_type string avl.Tree
var_id string 7f83b1657ff1fc53b92dc18148a1daddd200126d9069:21
value blob [Content of the variable if any]
refs_names json ["var.name"]
refs_ids json ["7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1:43"]

Query examples

Get last state for a specific var

SELECT 
    package, 
    value 
FROM 
    states 
WHERE 
    package='this.is/r/my/realm' and 
    height=last_height() and 
    var_name='avl.Tree';

Get all the states of a variable

SELECT 
    package, 
    value 
FROM 
    states 
WHERE 
    package='this.is/r/my/realm' and 
    var_name='avl.Tree';

Compare last two states of a variable

SELECT 
    value as 'previous',
    (
        SELECT 
            value 
        FROM 
            states 
        WHERE 
            package='this.is/r/my/realm' and 
            height=last_height() and 
            var_name='avl.Tree'
    ) as 'actual'
FROM 
    states 
WHERE 
    package='this.is/r/my/realm' and 
    height=last_height()-1 and 
    var_name='avl.Tree';

List all functions from a specific package

SELECT 
    name 
FROM 
    functions 
WHERE 
    package='this.is/r/my/realm' and 
    height=last_height();

Get all packages using the Render function

SELECT 
    package 
FROM 
    functions 
WHERE 
    name='Render' and 
    JSON_LENGTH(params) == 1 and 
    JSON_LENGTH(results) == 1 and
    height=last_height();