From bcc0ea32d656babf88758ebfbf1f04a6be187a92 Mon Sep 17 00:00:00 2001 From: "rose.shahar" Date: Thu, 15 Jan 2026 19:27:05 +0200 Subject: [PATCH] save in database the input and output of InternalTransactions --- .../java/org/tron/core/vm/program/Program.java | 10 ++++++++++ .../tron/common/runtime/InternalTransaction.java | 16 ++++++++++++++++ .../tron/core/capsule/utils/TransactionUtil.java | 2 ++ protocol/src/main/protos/core/Tron.proto | 4 ++++ 4 files changed, 32 insertions(+) diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 5da0b02ecb7..86daa5eaa57 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -816,6 +816,11 @@ this, new DataWord(newAddress), getContractAddress(), value, DataWord.ZERO(), // 4. CREATE THE CONTRACT OUT OF RETURN byte[] code = createResult.getHReturn(); + // capture output (deployed code) on internal transaction for indexing + if (internalTx != null) { + internalTx.setOutput(code); + } + if (code.length != 0 && VMConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { createResult.setException(Program.Exception .invalidCodeException()); @@ -1083,6 +1088,11 @@ this, new DataWord(contextAddress), memorySaveLimited(offset, buffer, size); returnDataBuffer = buffer; + + // capture output on internal transaction for indexing + if (internalTx != null) { + internalTx.setOutput(buffer); + } } // 5. REFUND THE REMAIN ENERGY diff --git a/chainbase/src/main/java/org/tron/common/runtime/InternalTransaction.java b/chainbase/src/main/java/org/tron/common/runtime/InternalTransaction.java index 06fe36cdea6..9a5c811e0bd 100644 --- a/chainbase/src/main/java/org/tron/common/runtime/InternalTransaction.java +++ b/chainbase/src/main/java/org/tron/common/runtime/InternalTransaction.java @@ -71,6 +71,11 @@ public class InternalTransaction { */ private String extra; + /* + * output/return data of the internal call + */ + private byte[] output; + /** * Construct a root InternalTransaction @@ -219,6 +224,17 @@ public String getExtra() { return extra == null ? "" : extra; } + public void setOutput(byte[] output) { + this.output = output; + } + + public byte[] getOutput() { + if (output == null) { + return EMPTY_BYTE_ARRAY; + } + return output.clone(); + } + public final byte[] getHash() { if (!isEmpty(hash)) { return Arrays.copyOf(hash, hash.length); diff --git a/chainbase/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java b/chainbase/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java index c9e0d30b1e6..fd8b101cce4 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java +++ b/chainbase/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java @@ -169,6 +169,8 @@ public static Protocol.InternalTransaction buildInternalTransaction(InternalTran itBuilder.setNote(ByteString.copyFrom(it.getNote().getBytes())); itBuilder.setRejected(it.isRejected()); itBuilder.setExtra(it.getExtra()); + itBuilder.setData(ByteString.copyFrom(it.getData())); + itBuilder.setOutput(ByteString.copyFrom(it.getOutput())); return itBuilder.build(); } diff --git a/protocol/src/main/protos/core/Tron.proto b/protocol/src/main/protos/core/Tron.proto index 2ffefbf9f3e..32a4ae98d86 100644 --- a/protocol/src/main/protos/core/Tron.proto +++ b/protocol/src/main/protos/core/Tron.proto @@ -648,6 +648,10 @@ message InternalTransaction { bytes note = 5; bool rejected = 6; string extra = 7; + // Input data of the internal transaction + bytes data = 8; + // Output/return data of the internal transaction + bytes output = 9; } message DelegatedResourceAccountIndex {