ewasm / design

Ewasm Design Overview and Specification
Apache License 2.0
1.02k stars 125 forks source link

Re-metering #97

Open axic opened 6 years ago

axic commented 6 years ago

This has been suggested by @poemm as a possible solution for updating gas costs in deployed contracts.

The current proposal is to meter contracts at deployment time which would lock in gas costs from that point on. In this method any "metering statements" (aka. call $useGas) does not receive any special handling and is just treated as a regular call.

With re-metering we could have two options: 1) update the constants in previously inserted metering statements (with the special rule of handling the first statement in each block) 2) always remove metering statements prior to metering

ehildenb commented 6 years ago

I don't like the idea of trying to identify which useGas were inserted by the metering contract and which were not. Would only really be ok with it if there was no way for the user to write useGas, but I don't think we want that either.

I think better solutions could be:

  1. Allow the clients to cache the metered version, instead of storing the metered version on chain. Standard network consensus governing when re-metering is necessary.
  2. Pass an enum to useGas instead of a concrete number. Eg, call useGas Wlow, where Wlow is represented with 0x03 or the like. The useGas function then is just a lookup table like Wlow => 3 and the like. Allows us to update the cost of operators without having to re-meter existing contracts, and we get to store the metered version. The problem here is that we need to pass in a list of arguments to useGas instead of a single argument now, because we want to meter many operators at once. We could just provide 10 useGas functions, accepting up to 10 gas enum elements. I believe that the function reference passing proposals for the WASM spec would allow us to pass a single function reference instead.