From 14151f5e623b37c9d47aee5192af6b3eeeae4a35 Mon Sep 17 00:00:00 2001 From: raulk Date: Wed, 16 Nov 2022 00:23:49 +0000 Subject: [PATCH] propagate actor events and Receipt::events_root. (#332) --- cgo/types.go | 5 ++++- fvm.go | 33 +++++++++++++++++++-------------- rust/Cargo.lock | 22 +++++++++++++--------- rust/Cargo.toml | 4 ++-- rust/src/fvm/engine.rs | 2 ++ rust/src/fvm/machine.rs | 24 ++++++++++++++++++++++++ rust/src/fvm/types.rs | 2 ++ 7 files changed, 66 insertions(+), 26 deletions(-) diff --git a/cgo/types.go b/cgo/types.go index 01d12b49..8f2adf33 100644 --- a/cgo/types.go +++ b/cgo/types.go @@ -110,6 +110,8 @@ type FvmMachineExecuteResponseGo struct { GasBurned int64 ExecTrace []byte FailureInfo string + Events []byte + EventsRoot []byte } func (ptr SliceBoxedUint8) slice() []byte { @@ -612,7 +614,6 @@ func (ptr *PoStProof) Destroy() { } } - func (ptr *resultFvmMachineExecuteResponse) statusCode() FCPResponseStatus { return FCPResponseStatus(ptr.status_code) } @@ -669,5 +670,7 @@ func (r FvmMachineExecuteResponse) copy() FvmMachineExecuteResponseGo { GasBurned: int64(r.gas_burned), ExecTrace: r.exec_trace.copy(), FailureInfo: string(r.failure_info.slice()), + Events: r.events.copy(), + EventsRoot: r.events_root.copy(), } } diff --git a/fvm.go b/fvm.go index 37bfa12b..907b2ee1 100644 --- a/fvm.go +++ b/fvm.go @@ -11,6 +11,7 @@ package ffi import "C" import ( "context" + "fmt" gobig "math/big" "runtime" @@ -129,20 +130,7 @@ func (f *FVM) ApplyMessage(msgBytes []byte, chainLen uint) (*ApplyRet, error) { return nil, err } - return &ApplyRet{ - Return: resp.ReturnVal, - ExitCode: resp.ExitCode, - GasUsed: int64(resp.GasUsed), - MinerPenalty: reformBigInt(resp.PenaltyHi, resp.PenaltyLo), - MinerTip: reformBigInt(resp.MinerTipHi, resp.MinerTipLo), - BaseFeeBurn: reformBigInt(resp.BaseFeeBurnHi, resp.BaseFeeBurnLo), - OverEstimationBurn: reformBigInt(resp.OverEstimationBurnHi, resp.OverEstimationBurnLo), - Refund: reformBigInt(resp.RefundHi, resp.RefundLo), - GasRefund: int64(resp.GasRefund), - GasBurned: int64(resp.GasBurned), - ExecTraceBytes: resp.ExecTrace, - FailureInfo: resp.FailureInfo, - }, nil + return buildResponse(resp) } func (f *FVM) ApplyImplicitMessage(msgBytes []byte) (*ApplyRet, error) { @@ -157,6 +145,19 @@ func (f *FVM) ApplyImplicitMessage(msgBytes []byte) (*ApplyRet, error) { return nil, err } + return buildResponse(resp) +} + +func buildResponse(resp cgo.FvmMachineExecuteResponseGo) (*ApplyRet, error) { + var eventsRoot *cid.Cid + if len(resp.EventsRoot) > 0 { + if eventsRootCid, err := cid.Cast(resp.EventsRoot); err != nil { + return nil, fmt.Errorf("failed to cast events root CID: %w", err) + } else { + eventsRoot = &eventsRootCid + } + } + return &ApplyRet{ Return: resp.ReturnVal, ExitCode: resp.ExitCode, @@ -170,6 +171,8 @@ func (f *FVM) ApplyImplicitMessage(msgBytes []byte) (*ApplyRet, error) { GasBurned: int64(resp.GasBurned), ExecTraceBytes: resp.ExecTrace, FailureInfo: resp.FailureInfo, + EventsRoot: eventsRoot, + EventsBytes: resp.Events, }, nil } @@ -196,6 +199,8 @@ type ApplyRet struct { GasBurned int64 ExecTraceBytes []byte FailureInfo string + EventsRoot *cid.Cid + EventsBytes []byte } // NOTE: We only support 64bit platforms diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 4a30893c..5353758d 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1198,12 +1198,12 @@ dependencies = [ "filepath", "fr32", "fvm 2.1.0", - "fvm 3.0.0-alpha.7", + "fvm 3.0.0-alpha.8", "fvm_ipld_blockstore", "fvm_ipld_encoding 0.2.2", "fvm_ipld_encoding 0.3.0", "fvm_shared 2.0.0", - "fvm_shared 3.0.0-alpha.10", + "fvm_shared 3.0.0-alpha.11", "group", "lazy_static", "libc", @@ -1423,9 +1423,9 @@ dependencies = [ [[package]] name = "fvm" -version = "3.0.0-alpha.7" +version = "3.0.0-alpha.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a57bb5c5c8d22801a445bb53a165b9e78bf53163090f571ed60e0fe920b88f" +checksum = "d558a9216545732649d0cc0d2d4c703b330103367f1f5353a27fa77309effb2f" dependencies = [ "anyhow", "blake2b_simd", @@ -1440,7 +1440,7 @@ dependencies = [ "fvm_ipld_blockstore", "fvm_ipld_encoding 0.3.0", "fvm_ipld_hamt 0.6.1", - "fvm_shared 3.0.0-alpha.10", + "fvm_shared 3.0.0-alpha.11", "lazy_static", "log", "multihash", @@ -1621,11 +1621,12 @@ dependencies = [ [[package]] name = "fvm_shared" -version = "3.0.0-alpha.10" +version = "3.0.0-alpha.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcd5f36e5c1628da1a002931f96a8cc3ea8fc517a6984e8d42457786528b88f0" +checksum = "d66b85f8971273def3bb366008319f8dc855be3172210c3b83b7b20353709b29" dependencies = [ "anyhow", + "bitflags 1.3.2", "blake2b_simd", "bls-signatures", "byteorder", @@ -1924,9 +1925,12 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" +checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +dependencies = [ + "cpufeatures", +] [[package]] name = "kernel32-sys" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index edc8c1f2..caa55b5b 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -37,8 +37,8 @@ memmap = "0.7" rust-gpu-tools = { version = "0.5", optional = true, default-features = false } storage-proofs-porep = { version = "~12.0", default-features = false } fr32 = { version = "~5.0", default-features = false } -fvm3 = { package = "fvm", version = "3.0.0-alpha.7", default-features = false, features = ["f4-as-account"] } -fvm3_shared = { package = "fvm_shared", version = "3.0.0-alpha.10" } +fvm3 = { package = "fvm", version = "3.0.0-alpha.8", default-features = false, features = ["f4-as-account"] } +fvm3_shared = { package = "fvm_shared", version = "3.0.0-alpha.11" } fvm3_ipld_encoding = { package = "fvm_ipld_encoding", version = "0.3.0" } fvm2 = { package = "fvm", version = "2.1.0", default-features = false } fvm2_shared = { package = "fvm_shared", version = "2.0.0" } diff --git a/rust/src/fvm/engine.rs b/rust/src/fvm/engine.rs index 2d39edc8..8e456509 100644 --- a/rust/src/fvm/engine.rs +++ b/rust/src/fvm/engine.rs @@ -222,6 +222,7 @@ mod v2 { exit_code: ExitCode::new(ret.msg_receipt.exit_code.value()), return_data: RawBytes::new(ret.msg_receipt.return_data.into()), gas_used: ret.msg_receipt.gas_used, + events_root: None, }, penalty: TokenAmount::from_atto(ret.penalty.atto().clone()), miner_tip: TokenAmount::from_atto(ret.miner_tip.atto().clone()), @@ -314,6 +315,7 @@ mod v2 { _ => None, }) .collect(), + events: vec![], }), Err(x) => Err(x), } diff --git a/rust/src/fvm/machine.rs b/rust/src/fvm/machine.rs index 0f9336f3..508751c3 100644 --- a/rust/src/fvm/machine.rs +++ b/rust/src/fvm/machine.rs @@ -271,6 +271,7 @@ fn fvm_machine_execute_message( exit_code, return_data, gas_used, + events_root, } = apply_ret.msg_receipt; let return_val = if return_data.is_empty() { @@ -280,6 +281,23 @@ fn fvm_machine_execute_message( Some(bytes.into_boxed_slice().into()) }; + let events = if apply_ret.events.is_empty() { + None + } else { + // This field is informational, if for whatever reason we fail to serialize + // return a None and move on. What's important for consensus is the + // events_root in the receipt. + to_vec(&apply_ret.events) + .map_err(|err| { + log::warn!("[UNEXPECTED] failed to serialize events: {}", err); + err + }) + .ok() + .map(|evts| evts.into_boxed_slice().into()) + }; + + let events_root = events_root.map(|cid| cid.to_bytes().into_boxed_slice().into()); + // TODO: Do something with the backtrace. Ok(FvmMachineExecuteResponse { exit_code: exit_code.value() as u64, @@ -299,6 +317,8 @@ fn fvm_machine_execute_message( gas_burned, exec_trace, failure_info, + events, + events_root, }) }) } @@ -377,6 +397,7 @@ fn build_lotus_trace( exit_code: ExitCode::OK, return_data: RawBytes::default(), gas_used: 0, + events_root: None, }, error: String::new(), gas_charges: vec![], @@ -395,6 +416,7 @@ fn build_lotus_trace( exit_code: ExitCode::OK, return_data, gas_used: 0, + events_root: None, }; return Ok(new_trace); } @@ -406,6 +428,7 @@ fn build_lotus_trace( exit_code, return_data: Default::default(), gas_used: 0, + events_root: None, }; return Ok(new_trace); } @@ -423,6 +446,7 @@ fn build_lotus_trace( exit_code, return_data: Default::default(), gas_used: 0, + events_root: None, }; return Ok(new_trace); } diff --git a/rust/src/fvm/types.rs b/rust/src/fvm/types.rs index ae2960dc..f6eef2a7 100644 --- a/rust/src/fvm/types.rs +++ b/rust/src/fvm/types.rs @@ -41,4 +41,6 @@ pub struct FvmMachineExecuteResponse { pub gas_burned: i64, pub exec_trace: Option>, pub failure_info: Option, + pub events: Option>, + pub events_root: Option>, }