Skip to content

Commit

Permalink
Merge branch 'master' into issue419
Browse files Browse the repository at this point in the history
  • Loading branch information
陈志同 authored Dec 14, 2020
2 parents a60fabb + 06828a4 commit a9e039f
Show file tree
Hide file tree
Showing 10 changed files with 69 additions and 13 deletions.
2 changes: 1 addition & 1 deletion src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Neo" Version="3.0.0-CI01097" />
<PackageReference Include="Neo" Version="3.0.0-CI01098" />
</ItemGroup>

</Project>
4 changes: 2 additions & 2 deletions src/RpcClient/ContractClient.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using System;
using System.Threading.Tasks;
using Neo.Network.P2P.Payloads;
using Neo.Network.RPC.Models;
using Neo.SmartContract;
using Neo.SmartContract.Manifest;
using Neo.SmartContract.Native;
using Neo.VM;
using Neo.Wallets;

Expand Down Expand Up @@ -57,7 +57,7 @@ public async Task<Transaction> CreateDeployContractTxAsync(byte[] nefFile, Contr
byte[] script;
using (ScriptBuilder sb = new ScriptBuilder())
{
sb.EmitSysCall(ApplicationEngine.System_Contract_Call, SmartContract.Native.NativeContract.Management.Hash, "deploy", nefFile, manifest.ToString());
sb.EmitAppCall(NativeContract.Management.Hash, "deploy", contractScript, manifest.ToString());
script = sb.ToArray();
}
UInt160 sender = Contract.CreateSignatureRedeemScript(key.PublicKey).ToScriptHash();
Expand Down
2 changes: 1 addition & 1 deletion src/RpcClient/Models/RpcContractState.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Neo;
using Neo.IO.Json;
using Neo.Ledger;
using Neo.SmartContract;
using Neo.SmartContract.Manifest;
using System;
Expand All @@ -21,6 +20,7 @@ public static RpcContractState FromJson(JObject json)
ContractState = new ContractState
{
Id = (int)json["id"].AsNumber(),
UpdateCounter = (ushort)json["updatecounter"].AsNumber(),
Hash = UInt160.Parse(json["hash"].AsString()),
Script = Convert.FromBase64String(json["script"].AsString()),
Manifest = ContractManifest.FromJson(json["manifest"])
Expand Down
1 change: 1 addition & 0 deletions src/RpcClient/RpcClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ public static ContractState ContractStateFromJson(JObject json)
return new ContractState
{
Id = (int)json["id"].AsNumber(),
UpdateCounter = (ushort)json["updatecounter"].AsNumber(),
Hash = UInt160.Parse(json["hash"].AsString()),
Script = Convert.FromBase64String(json["script"].AsString()),
Manifest = ContractManifest.FromJson(json["manifest"])
Expand Down
5 changes: 2 additions & 3 deletions src/RpcNep17Tracker/RpcNep17Tracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ public JObject GetNep17Transfers(JArray _params)
[RpcMethod]
public JObject GetNep17Balances(JArray _params)
{
using SnapshotView snapshot = Blockchain.Singleton.GetSnapshot();
UInt160 userScriptHash = GetScriptHashFromParam(_params[0].AsString());

JObject json = new JObject();
Expand All @@ -286,9 +287,7 @@ public JObject GetNep17Balances(JArray _params)
foreach (var (key, value) in dbCache.Find(prefix))
{
JObject balance = new JObject();

var contract = NativeContract.Management.GetContract(Blockchain.Singleton.GetSnapshot(), key.AssetScriptHash);
if (contract is null)
if (NativeContract.Management.GetContract(snapshot, key.AssetScriptHash) is null)
continue;
balance["assethash"] = key.AssetScriptHash.ToString();
balance["amount"] = value.Balance.ToString();
Expand Down
8 changes: 6 additions & 2 deletions src/RpcServer/RpcServer.Blockchain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Neo.Ledger;
using Neo.Network.P2P.Payloads;
using Neo.Persistence;
using Neo.SmartContract;
using Neo.SmartContract.Native;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -103,8 +104,9 @@ protected virtual JObject GetBlockHeader(JArray _params)
[RpcMethod]
protected virtual JObject GetContractState(JArray _params)
{
using SnapshotView snapshot = Blockchain.Singleton.GetSnapshot();
UInt160 script_hash = ToScriptHash(_params[0].AsString());
var contract = NativeContract.Management.GetContract(Blockchain.Singleton.GetSnapshot(), script_hash);
ContractState contract = NativeContract.Management.GetContract(snapshot, script_hash);
return contract?.ToJson() ?? throw new RpcException(-100, "Unknown contract");
}

Expand Down Expand Up @@ -166,8 +168,10 @@ protected virtual JObject GetStorage(JArray _params)
{
if (!int.TryParse(_params[0].AsString(), out int id))
{
using SnapshotView snapshot = Blockchain.Singleton.GetSnapshot();
UInt160 script_hash = UInt160.Parse(_params[0].AsString());
var contract = NativeContract.Management.GetContract(Blockchain.Singleton.GetSnapshot(), script_hash);
ContractState contract = NativeContract.Management.GetContract(snapshot, script_hash);

if (contract == null) return null;
id = contract.Id;
}
Expand Down
51 changes: 51 additions & 0 deletions src/RpcServer/RpcServer.SmartContract.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,57 @@ private static Signers SignersFromJson(JArray _params)
return ret;
}

private JObject GetVerificationResult(UInt160 scriptHash, ContractParameter[] args, Signers signers = null)
{
var snapshot = Blockchain.Singleton.GetSnapshot();
var contract = snapshot.Contracts.TryGet(scriptHash);
if (contract is null)
{
throw new RpcException(-100, "Unknown contract");
}
var methodName = "verify";

Transaction tx = signers == null ? null : new Transaction
{
Signers = signers.GetSigners(),
Attributes = Array.Empty<TransactionAttribute>(),
Witnesses = signers.Witnesses,
};

using ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot.Clone());
engine.LoadContract(contract, methodName, CallFlags.None);

engine.LoadScript(new ScriptBuilder().EmitAppCall(scriptHash, methodName, args).ToArray(), CallFlags.AllowCall);

JObject json = new JObject();
json["script"] = Convert.ToBase64String(contract.Script);
json["state"] = engine.Execute();
json["gasconsumed"] = new BigDecimal(engine.GasConsumed, NativeContract.GAS.Decimals).ToString();
json["exception"] = GetExceptionMessage(engine.FaultException);
try
{
json["stack"] = new JArray(engine.ResultStack.Select(p => p.ToJson()));
}
catch (InvalidOperationException)
{
json["stack"] = "error: recursive reference";
}
if (engine.State != VMState.FAULT)
{
ProcessInvokeWithWallet(json);
}
return json;
}

[RpcMethod]
protected virtual JObject InvokeContractVerify(JArray _params)
{
UInt160 script_hash = UInt160.Parse(_params[0].AsString());
ContractParameter[] args = _params.Count >= 2 ? ((JArray)_params[1]).Select(p => ContractParameter.FromJson(p)).ToArray() : new ContractParameter[0];
Signers signers = _params.Count >= 3 ? SignersFromJson((JArray)_params[2]) : null;
return GetVerificationResult(script_hash, args, signers);
}

[RpcMethod]
protected virtual JObject InvokeFunction(JArray _params)
{
Expand Down
2 changes: 1 addition & 1 deletion src/RpcServer/RpcServer.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<PackageId>Neo.Plugins.RpcServer</PackageId>
Expand Down
5 changes: 3 additions & 2 deletions tests/Neo.Network.RPC.Tests/RpcTestCases.json
Original file line number Diff line number Diff line change
Expand Up @@ -319,14 +319,15 @@
"jsonrpc": "2.0",
"id": 1,
"method": "getcontractstate",
"params": [ "0xb399c051778cf37a1e4ef88509b2e054d0420a32" ]
"params": [ "0xb399c051778cf37a1e4ef88509b2e054d0420a32" ],
"id": 1
},
"Response": {
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": -2,
"updatecounter": 0,
"updatecounter": 2,
"hash": "0xb399c051778cf37a1e4ef88509b2e054d0420a32",
"script": "DANHQVNBGvd7Zw==",
"manifest": {
Expand Down
2 changes: 1 addition & 1 deletion tests/Neo.Network.RPC.Tests/UT_ContractClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public async Task TestDeployContract()
};
using (ScriptBuilder sb = new ScriptBuilder())
{
sb.EmitSysCall(ApplicationEngine.System_Contract_Call, NativeContract.Management.Hash, "deploy", new byte[1], manifest.ToString());
sb.EmitAppCall(NativeContract.Management.Hash, "deploy", new byte[1], manifest.ToString());
script = sb.ToArray();
}

Expand Down

0 comments on commit a9e039f

Please sign in to comment.