From 0c708e982513159a265ca7305b9bf2f8ff57d1e9 Mon Sep 17 00:00:00 2001 From: Ivan Poon Date: Wed, 7 Feb 2018 23:12:57 +0800 Subject: [PATCH 1/2] Add TransactionInvocation.GetScript to StateReader This allows smart contracts to check that the transaction is an invocation to the same contract during verification phase. Example use case: https://github.com/neo-project/proposals/pull/18#issuecomment-353839621 --- neo/SmartContract/StateReader.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/neo/SmartContract/StateReader.cs b/neo/SmartContract/StateReader.cs index f10aca0c53..9f64e86575 100644 --- a/neo/SmartContract/StateReader.cs +++ b/neo/SmartContract/StateReader.cs @@ -104,6 +104,8 @@ public StateReader() Register("Neo.Transaction.GetOutputs", Transaction_GetOutputs); Register("Neo.Transaction.GetReferences", Transaction_GetReferences); Register("Neo.Transaction.GetUnspentCoins", Transaction_GetUnspentCoins); + Register("Neo.Transaction.GetUnspentCoins", Transaction_GetUnspentCoins); + Register("Neo.InvocationTransaction.GetScript", InvocationTransaction_GetScript); Register("Neo.Attribute.GetUsage", Attribute_GetUsage); Register("Neo.Attribute.GetData", Attribute_GetData); Register("Neo.Input.GetHash", Input_GetHash); @@ -671,6 +673,18 @@ protected virtual bool Transaction_GetUnspentCoins(ExecutionEngine engine) return false; } + protected virtual bool InvocationTransaction_GetScript(ExecutionEngine engine) + { + if (engine.EvaluationStack.Pop() is InteropInterface _interface) + { + InvocationTransaction tx = _interface.GetInterface(); + if (tx == null) return false; + engine.EvaluationStack.Push(tx.Script); + return true; + } + return false; + } + protected virtual bool Attribute_GetUsage(ExecutionEngine engine) { if (engine.EvaluationStack.Pop() is InteropInterface _interface) From 30e191e80211a8aa72e51fcf2a424b399a70c924 Mon Sep 17 00:00:00 2001 From: Erik Zhang Date: Thu, 8 Feb 2018 14:03:06 +0800 Subject: [PATCH 2/2] Update StateReader.cs --- neo/SmartContract/StateReader.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/neo/SmartContract/StateReader.cs b/neo/SmartContract/StateReader.cs index 9f64e86575..5ae79fc227 100644 --- a/neo/SmartContract/StateReader.cs +++ b/neo/SmartContract/StateReader.cs @@ -104,7 +104,6 @@ public StateReader() Register("Neo.Transaction.GetOutputs", Transaction_GetOutputs); Register("Neo.Transaction.GetReferences", Transaction_GetReferences); Register("Neo.Transaction.GetUnspentCoins", Transaction_GetUnspentCoins); - Register("Neo.Transaction.GetUnspentCoins", Transaction_GetUnspentCoins); Register("Neo.InvocationTransaction.GetScript", InvocationTransaction_GetScript); Register("Neo.Attribute.GetUsage", Attribute_GetUsage); Register("Neo.Attribute.GetData", Attribute_GetData);