Skip to content
This repository was archived by the owner on May 13, 2022. It is now read-only.

Commit 7782261

Browse files
committed
Implement some more ewasm functions
Signed-off-by: Sean Young <sean@mess.org>
1 parent 3ec7682 commit 7782261

4 files changed

Lines changed: 169 additions & 6 deletions

File tree

execution/solidity/ewasm.solang

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,18 @@ interface E {
33
function get_number() external returns (int);
44
}
55

6+
event L (
7+
int indexed f1,
8+
string f2,
9+
bool f3
10+
);
11+
612
contract ewasm is E {
7-
function get_vm() public override returns (string memory) {
13+
function get_vm() public override pure returns (string memory) {
814
return "ewasm";
915
}
1016

11-
function get_number() public override returns (int) {
17+
function get_number() public pure override returns (int) {
1218
return 54321;
1319
}
1420

@@ -38,4 +44,8 @@ contract ewasm is E {
3844

3945
assert(hash3 == hex"527a6a4b9a6da75607546842e0e00105350b1aaf");
4046
}
47+
48+
function test_events() public {
49+
emit L(102, "Hello from wasm", true);
50+
}
4151
}

execution/solidity/ewasm.solang.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ package solidity
22

33
import hex "github.com/tmthrgd/go-hex"
44

5-
var Bytecode_ewasm = hex.MustDecodeString("0061736D01000000011C0660017F006000017F60037F7F7F0060027F7F0060017F017F60000002680508657468657265756D0C67657443616C6C56616C7565000008657468657265756D0B676574436F646553697A65000108657468657265756D08636F6465436F7079000208657468657265756D0666696E697368000308657468657265756D0672657665727400030304030405050405017001010105030100020608017F01418080040B071102066D656D6F72790200046D61696E00070AB40203A60101047F418080042101024003400240200128020C0D002001280208220220004F0D020B200128020022010D000B41002101410028020821020B02402002200041076A41787122036B22024118490D00200120036A41106A22002001280200220436020002402004450D00200420003602040B2000200241706A3602082000410036020C2000200136020420012000360200200120033602080B2001410136020C200141106A0B2E004100410036028080044100410036028480044100410036028C800441003F0041107441F0FF7B6A36028880040B5B01027F230041106B220024002000100002402000290300200041086A290300844200520D0010064100100141BE696A22003602C41241002000100522013602C812200141C21620001002410041C2121003000B410041001004000B0BC912010041000BC2120061736D0100000001340960017F006000017F60037F7F7F0060027F7F0060057E7F7F7F7F017F60037F7F7F017F60017F017F60047F7F7F7F017F60000002B7010808657468657265756D0C67657443616C6C56616C7565000008657468657265756D0F67657443616C6C4461746153697A65000108657468657265756D0C63616C6C44617461436F7079000208657468657265756D06726576657274000308657468657265756D0463616C6C000408657468657265756D1167657452657475726E4461746153697A65000108657468657265756D0E72657475726E44617461436F7079000208657468657265756D0666696E6973680003030B0A020302020205060708080405017001010105030100020608017F01418080040B071102066D656D6F72790200046D61696E00110AF70F0A2E0002402002450D000340200020012D00003A0000200041016A2100200141016A21012002417F6A22020D000B0B0B240002402001450D00034020004200370300200041086A21002001417F6A22010D000B0B0B2D002000411F6A21000340200120002D00003A0000200141016A21012000417F6A21002002417F6A22020D000B0B2D002001411F6A21010340200120002D00003A00002001417F6A2101200041016A21002002417F6A22020D000B0B29002001417F6A21010340200120026A20002D00003A0000200041016A21002002417F6A22020D000B0B7E01017F200120006C220141086A100E2203200036020420032000360200200341086A2100024002402002417F460D002001450D010340200020022D00003A0000200041016A2100200241016A21022001417F6A22010D000C020B0B2001450D000340200041003A0000200041016A21002001417F6A22010D000B0B20030BA60101047F418080042101024003400240200128020C0D002001280208220220004F0D020B200128020022010D000B41002101410028020821020B02402002200041076A41787122036B22024118490D00200120036A41106A22002001280200220436020002402004450D00200420003602040B2000200241706A3602082000410036020C2000200136020420012000360200200120033602080B2001410136020C200141106A0B7F01027F200320016A220441086A100E2205200436020420052004360200200541086A210402402001450D000340200420002D00003A0000200441016A2104200041016A21002001417F6A22010D000B0B02402003450D000340200420022D00003A0000200441016A2104200241016A21022003417F6A22030D000B0B20050B2E004100410036028080044100410036028480044100410036028C800441003F0041107441F0FF7B6A36028880040BC40A03057F037E017F230041F0016B22002400200022011000024002400240024002400240024002402001290300200141086A290300844200520D00101041001001220236021841002002100E220336021C2003410020021002024002400240024002400240200241034D0D004100200328020022043602142002417C6A2102200341046A21030240200441EDE98EBF064A0D002004419BF9C68004460D062004419DB3A4957D460D02200441A0BFE9E605470D0141004100100300000B200441E482B9CC07460D03200441EEE98EBF06460D022004419797CBC406460D040B410041001003000B4100450D05410041001003000B200141286A42003703002001420037032020014200370318200142B1A8033703104100450D05410041001003000B024002400240024020024120490D002003200141306A4118100A200141C0006A3502002105200141306A41086A2903002106200129033021074108100E1A4108100E1A4104100E2202419797CBC406360200200241046A41001009200142003703C001200142003703B80120012006370398012001200737039001200120053E02A00120014190016A200141D0016A4114100C42FFFFFFFFFFFFFFFFFF00200141D0016A200141B8016A2002410410040D091005220241086A100E22032002360200200341046A2002360200200341086A220441002002100620033502002205421F580D0120042001418C016A4104100A200135028C01220742207C22062005560D0220042007A76A200141A8016A4104100A0240200620012802A8012202AD7C2005560D0020014100410D2002410120042006A76A100D220241086A2002280200100F3602484100450D0E0C040B4102450D0D0C030B200141F0016A240041020F0B41020D010C0B0B4102450D0A0B410041001003000B4108100E1A200141054101410D100D36024C4100450D05410041001003000B02400240024020024120490D002003200141D0006A4118100A200141E0006A3502002105200141D0006A41086A2903002106200129035021074104100E220241EEE98EBF06360200200241046A41001009200142003703B001200142003703A801200120063703C001200120073703B801200120053E02C801200141B8016A20014190016A4114100C42FFFFFFFFFFFFFFFFFF0020014190016A200141A8016A2002410410040D081005220241086A100E22032002360200200341046A2002360200200341086A22044100200210062003280200411F4D0D012004200141D0016A4120100A200141E8006A41186A200141D0016A41186A2903003703002001200141E0016A2903003703782001200141D8016A290300370370200120012903D00137036841000D020C090B200141F0016A240041020F0B4102450D070B410041001003000B410041001003000B410041001007000B4120100E220241041009200141106A20024120100B200241201007000B410041001003000B200128024C280200413F6A41607141206A2203100E220220034103761009200041706A22042200240020044120360200200420024104100B200128024C22082802002101200041706A22042400200420013602002004200241206A4104100B200241C0006A200841086A20011008200220031007000B410041001003000B4120100E220241041009200141E8006A20024120100B200241201007000B2001280248280200413F6A41607141206A2203100E220220034103761009200041706A22042200240020044120360200200420024104100B200128024822082802002101200041706A22042400200420013602002004200241206A4104100B200241C0006A200841086A20011008200220031007000B0B18010041000B12657761736D2063616C6C656420657761736D")
6-
var Abi_ewasm = []byte(`[{"name":"get_vm","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"name":"get_number","type":"function","inputs":[],"outputs":[{"name":"","type":"int256","internalType":"int256"}],"stateMutability":"nonpayable"},{"name":"call_get_vm","type":"function","inputs":[{"name":"e","type":"address","internalType":"contract E"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"name":"call_get_number","type":"function","inputs":[{"name":"e","type":"address","internalType":"contract E"}],"outputs":[{"name":"","type":"int256","internalType":"int256"}],"stateMutability":"nonpayable"},{"name":"try_revert","type":"function","inputs":[],"outputs":[],"stateMutability":"pure"},{"name":"hash_tests","type":"function","inputs":[],"outputs":[],"stateMutability":"pure"}]`)
5+
var Bytecode_ewasm = hex.MustDecodeString("0061736D01000000011C0660017F006000017F60037F7F7F0060027F7F0060017F017F60000002680508657468657265756D0C67657443616C6C56616C7565000008657468657265756D0B676574436F646553697A65000108657468657265756D08636F6465436F7079000208657468657265756D0666696E697368000308657468657265756D0672657665727400030304030405050405017001010105030100020608017F01418080040B071102066D656D6F72790200046D61696E00070AB40203A60101047F418080042101024003400240200128020C0D002001280208220220004F0D020B200128020022010D000B41002101410028020821020B02402002200041076A41787122036B22024118490D00200120036A41106A22002001280200220436020002402004450D00200420003602040B2000200241706A3602082000410036020C2000200136020420012000360200200120033602080B2001410136020C200141106A0B2E004100410036028080044100410036028480044100410036028C800441003F0041107441F0FF7B6A36028880040B5B01027F230041106B220024002000100002402000290300200041086A290300844200520D001006410010014188676A22003602F81441002000100522013602FC14200141F81820001002410041F8141003000B410041001004000B0BFF14010041000BF8140061736D01000000013E0A60017F006000017F60037F7F7F0060027F7F0060077F7F7F7F7F7F7F0060057E7F7F7F7F017F60037F7F7F017F60017F017F60047F7F7F7F017F60000002C6010908657468657265756D0C67657443616C6C56616C7565000008657468657265756D0F67657443616C6C4461746153697A65000108657468657265756D0C63616C6C44617461436F7079000208657468657265756D06726576657274000308657468657265756D036C6F67000408657468657265756D0463616C6C000508657468657265756D1167657452657475726E4461746153697A65000108657468657265756D0E72657475726E44617461436F7079000208657468657265756D0666696E6973680003030B0A020302020206070809090405017001010105030100020608017F01418080040B071102066D656D6F72790200046D61696E00120AE4110A2E0002402002450D000340200020012D00003A0000200041016A2100200141016A21012002417F6A22020D000B0B0B240002402001450D00034020004200370300200041086A21002001417F6A22010D000B0B0B2D002000411F6A21000340200120002D00003A0000200141016A21012000417F6A21002002417F6A22020D000B0B2D002001411F6A21010340200120002D00003A00002001417F6A2101200041016A21002002417F6A22020D000B0B29002001417F6A21010340200120026A20002D00003A0000200041016A21002002417F6A22020D000B0B7E01017F200120006C220141086A100F2203200036020420032000360200200341086A2100024002402002417F460D002001450D010340200020022D00003A0000200041016A2100200241016A21022001417F6A22010D000C020B0B2001450D000340200041003A0000200041016A21002001417F6A22010D000B0B20030BA60101047F418080042101024003400240200128020C0D002001280208220220004F0D020B200128020022010D000B41002101410028020821020B02402002200041076A41787122036B22024118490D00200120036A41106A22002001280200220436020002402004450D00200420003602040B2000200241706A3602082000410036020C2000200136020420012000360200200120033602080B2001410136020C200141106A0B7F01027F200320016A220441086A100F2205200436020420052004360200200541086A210402402001450D000340200420002D00003A0000200441016A2104200041016A21002001417F6A22010D000B0B02402003450D000340200420022D00003A0000200441016A2104200241016A21022003417F6A22030D000B0B20050B2E004100410036028080044100410036028480044100410036028C800441003F0041107441F0FF7B6A36028880040BB10C03057F037E017F230041F0016B2200240020002201100002400240024002400240024002400240024002402001290300200141086A290300844200520D00101141001001220236024841002002100F220336024C2003410020021002200241034D0D094100200328020022043602442002417C6A2102200341046A210302400240024002400240024002402004419FBFE9E6054A0D002004419BF9C68004460D04200441A89B8AAA7A460D012004419DB3A4957D470D104100450D0C410041001003000B200441E382B9CC074A0D02200441A0BFE9E605460D04200441EEE98EBF06460D012004419797CBC406460D050C0F0B410F41014100100E2203280200413F6A41607141C0006A2204100F22022004410376100A200141C0003602900120014190016A20024104100C2001200328020022003602B801200141B8016A200241C0006A4104100C200241E0006A200341086A200010092002413F6A41013A00004120100F22034104100A200141E8016A4200370300200142003703E001200142003703D801200142E6003703D001200141D0016A20034120100C200220044102411020034100410010044100450D06410041001003000B200141286A42003703002001420037032020014200370318200142B1A8033703104100450D06410041001003000B200441E482B9CC07470D0C024002400240024020024120490D002003200141306A4118100B200141C0006A3502002105200141306A41086A2903002106200129033021074108100F1A4108100F1A4104100F2202419797CBC406360200200241046A4100100A200142003703C001200142003703B80120012006370398012001200737039001200120053E02A00120014190016A200141D0016A4114100D42FFFFFFFFFFFFFFFFFF00200141D0016A200141B8016A2002410410050D0A1006220241086A100F22032002360200200341046A2002360200200341086A220441002002100720033502002205421F580D0120042001418C016A4104100B200135028C01220742207C22062005560D0220042007A76A200141A8016A4104100B0240200620012802A8012202AD7C2005560D0020014130410D2002410120042006A76A100E220241086A2002280200101036024C4100450D100C040B4102450D0F0C030B200141F0016A240041020F0B41020D010C0D0B4102450D0C0B410041001003000B02400240024020024120490D002003200141D0006A4118100B200141E0006A3502002105200141D0006A41086A2903002106200129035021074104100F220241EEE98EBF06360200200241046A4100100A200142003703B001200142003703A801200120063703C001200120073703B801200120053E02C801200141B8016A20014190016A4114100D42FFFFFFFFFFFFFFFFFF0020014190016A200141A8016A2002410410050D091006220241086A100F22032002360200200341046A2002360200200341086A22044100200210072003280200411F4D0D012004200141D0016A4120100B200141E8006A41186A200141D0016A41186A2903003703002001200141E0016A2903003703782001200141D8016A290300370370200120012903D00137036841000D020C0C0B200141F0016A240041020F0B4102450D0A0B410041001003000B41004100100300000B4108100F1A200141054101413D100E360288014100450D06410041001003000B410041001003000B410041001008000B4120100F22024104100A200141106A20024120100C200241201008000B410041001003000B410041001003000B410041001008000B200128028801280200413F6A41607141206A2203100F22022003410376100A200041706A22042200240020044120360200200420024104100C20012802880122082802002101200041706A22042400200420013602002004200241206A4104100C200241C0006A200841086A20011009200220031008000B4120100F22024104100A200141E8006A20024120100C200241201008000B200128024C280200413F6A41607141206A2203100F22022003410376100A200041706A22042200240020044120360200200420024104100C200128024C22082802002101200041706A22042400200420013602002004200241206A4104100C200241C0006A200841086A20011009200220031008000B410041001003000B0B48010041000B4248656C6C6F2066726F6D207761736D007177213B393C76BAF374B5A91F5A8E4A972270CEFDDA6375DF53FB1A3CAC11C9657761736D2063616C6C656420657761736D")
6+
var Abi_ewasm = []byte(`[{"name":"get_vm","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"name":"get_number","type":"function","inputs":[],"outputs":[{"name":"","type":"int256","internalType":"int256"}],"stateMutability":"pure"},{"name":"call_get_vm","type":"function","inputs":[{"name":"e","type":"address","internalType":"contract E"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"name":"call_get_number","type":"function","inputs":[{"name":"e","type":"address","internalType":"contract E"}],"outputs":[{"name":"","type":"int256","internalType":"int256"}],"stateMutability":"nonpayable"},{"name":"try_revert","type":"function","inputs":[],"outputs":[],"stateMutability":"pure"},{"name":"hash_tests","type":"function","inputs":[],"outputs":[],"stateMutability":"pure"},{"name":"test_events","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"L","type":"event","inputs":[{"name":"f1","type":"int256","internalType":"int256","indexed":true},{"name":"f2","type":"string","internalType":"string"},{"name":"f3","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":""}]`)

execution/wasm/contract.go

Lines changed: 128 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"math/big"
77

8+
"github.com/hyperledger/burrow/execution/evm"
89
"github.com/hyperledger/burrow/execution/exec"
910

1011
bin "github.com/hyperledger/burrow/binary"
@@ -84,6 +85,12 @@ func (ctx *context) ResolveFunc(module, field string) lifeExec.FunctionImport {
8485

8586
switch field {
8687
case "call":
88+
fallthrough
89+
case "callCode":
90+
fallthrough
91+
case "callDelegate":
92+
fallthrough
93+
case "callStatic":
8794
return func(vm *lifeExec.VirtualMachine) int64 {
8895
gasLimit := big.NewInt(vm.GetCurrentFrame().Locals[0])
8996
addressPtr := uint32(vm.GetCurrentFrame().Locals[1])
@@ -97,10 +104,25 @@ func (ctx *context) ResolveFunc(module, field string) lifeExec.FunctionImport {
97104
// TODO: is this guaranteed to be okay? Should be avoid panic here if out of bounds?
98105
value := bin.BigIntFromLittleEndianBytes(vm.Memory[valuePtr : valuePtr+ValueByteSize])
99106

107+
var callType exec.CallType
108+
109+
switch field {
110+
case "call":
111+
callType = exec.CallTypeCall
112+
case "callCode":
113+
callType = exec.CallTypeCode
114+
case "callStatic":
115+
callType = exec.CallTypeStatic
116+
case "callDeletegate":
117+
callType = exec.CallTypeDelegate
118+
default:
119+
panic("should not happen")
120+
}
121+
100122
var err error
101123
ctx.returnData, err = engine.CallFromSite(ctx.state, ctx.vm.externalDispatcher, ctx.params,
102124
engine.CallParams{
103-
CallType: exec.CallTypeCall,
125+
CallType: callType,
104126
Callee: target,
105127
Input: vm.Memory[dataPtr : dataPtr+dataLen],
106128
Value: *value,
@@ -121,7 +143,6 @@ func (ctx *context) ResolveFunc(module, field string) lifeExec.FunctionImport {
121143
// Spec says return 1 for error, but not sure when to do that (as opposed to abort):
122144
// https://github.com/ewasm/design/blob/master/eth_interface.md#call
123145
panic(err)
124-
return Error
125146
}
126147
return Success
127148
}
@@ -279,6 +300,111 @@ func (ctx *context) ResolveFunc(module, field string) lifeExec.FunctionImport {
279300
return Success
280301
}
281302

303+
case "getBlockTimestamp":
304+
return func(vm *lifeExec.VirtualMachine) int64 {
305+
return int64(ctx.state.Blockchain.LastBlockTime().Unix())
306+
}
307+
308+
case "getBlockNumber":
309+
return func(vm *lifeExec.VirtualMachine) int64 {
310+
return int64(ctx.state.Blockchain.LastBlockHeight())
311+
}
312+
313+
case "getTxOrigin":
314+
return func(vm *lifeExec.VirtualMachine) int64 {
315+
addressPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
316+
317+
copy(vm.Memory[addressPtr:addressPtr+crypto.AddressLength], ctx.params.Origin.Bytes())
318+
319+
return Success
320+
}
321+
322+
case "getCaller":
323+
return func(vm *lifeExec.VirtualMachine) int64 {
324+
addressPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
325+
326+
copy(vm.Memory[addressPtr:addressPtr+crypto.AddressLength], ctx.params.Caller.Bytes())
327+
328+
return Success
329+
}
330+
331+
case "getBlockGasLimit":
332+
return func(vm *lifeExec.VirtualMachine) int64 {
333+
return ctx.params.Gas.Int64()
334+
}
335+
336+
case "getGasLeft":
337+
return func(vm *lifeExec.VirtualMachine) int64 {
338+
// do the same as EVM
339+
return ctx.params.Gas.Int64()
340+
}
341+
342+
case "getBlockCoinbase":
343+
return func(vm *lifeExec.VirtualMachine) int64 {
344+
// do the same as EVM
345+
addressPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
346+
347+
copy(vm.Memory[addressPtr:addressPtr+crypto.AddressLength], crypto.ZeroAddress.Bytes())
348+
349+
return Success
350+
}
351+
352+
case "getBlockHash":
353+
return func(vm *lifeExec.VirtualMachine) int64 {
354+
blockNumber := uint64(vm.GetCurrentFrame().Locals[0])
355+
hashPtr := int(vm.GetCurrentFrame().Locals[1])
356+
357+
lastBlockHeight := ctx.state.Blockchain.LastBlockHeight()
358+
if blockNumber >= lastBlockHeight {
359+
panic(fmt.Sprintf(" => attempted to get block hash of a non-existent block: %v", blockNumber))
360+
} else if lastBlockHeight-blockNumber > evm.MaximumAllowedBlockLookBack {
361+
panic(fmt.Sprintf(" => attempted to get block hash of a block %d outside of the allowed range "+
362+
"(must be within %d blocks)", blockNumber, evm.MaximumAllowedBlockLookBack))
363+
} else {
364+
hash, err := ctx.state.Blockchain.BlockHash(blockNumber)
365+
if err != nil {
366+
panic(fmt.Sprintf(" => blockhash failed: %v", err))
367+
}
368+
369+
copy(vm.Memory[hashPtr:hashPtr+len(hash)], hash)
370+
}
371+
372+
return Success
373+
}
374+
375+
case "log":
376+
return func(vm *lifeExec.VirtualMachine) int64 {
377+
dataPtr := int(uint32(vm.GetCurrentFrame().Locals[0]))
378+
dataLen := int(uint32(vm.GetCurrentFrame().Locals[1]))
379+
380+
data := vm.Memory[dataPtr : dataPtr+dataLen]
381+
382+
topicCount := uint32(vm.GetCurrentFrame().Locals[2])
383+
topics := make([]bin.Word256, topicCount)
384+
385+
if topicCount > 4 {
386+
panic(fmt.Sprintf("%d topics not permitted", topicCount))
387+
}
388+
389+
for i := uint32(0); i < topicCount; i++ {
390+
topicPtr := int(uint32(vm.GetCurrentFrame().Locals[3+i]))
391+
topicData := vm.Memory[topicPtr : topicPtr+bin.Word256Bytes]
392+
topics[i] = bin.RightPadWord256(topicData)
393+
}
394+
395+
err := ctx.state.EventSink.Log(&exec.LogEvent{
396+
Address: ctx.params.Callee,
397+
Topics: topics,
398+
Data: data,
399+
})
400+
401+
if err != nil {
402+
panic(fmt.Sprintf(" => log failed: %v", err))
403+
}
404+
405+
return Success
406+
}
407+
282408
default:
283409
panic(fmt.Sprintf("unknown function %s", field))
284410
}

0 commit comments

Comments
 (0)