Example #1
0
        public static string GetBlockchainPath(this ExpressWalletAccount account)
        {
            if (account == null)
            {
                throw new ArgumentNullException(nameof(account));
            }

            return(Path.Combine(Program.ROOT_PATH, account.ScriptHash));
        }
Example #2
0
        public Task <UInt256> ExecuteAsync(ExpressWalletAccount account, Neo.VM.Script script, decimal additionalGas = 0)
        {
            if (disposedValue)
            {
                throw new ObjectDisposedException(nameof(OfflineNode));
            }

            var devAccount = DevWalletAccount.FromExpressWalletAccount(account);
            var devWallet  = new DevWallet(string.Empty, devAccount);
            var signer     = new Signer()
            {
                Account = devAccount.ScriptHash, Scopes = WitnessScope.CalledByEntry
            };
            var tx = devWallet.MakeTransaction(script, devAccount.ScriptHash, new[] { signer });

            if (additionalGas > 0.0m)
            {
                tx.SystemFee += (long)additionalGas.ToBigInteger(NativeContract.GAS.Decimals);
            }
            var context = new ContractParametersContext(tx);

            if (devAccount.IsMultiSigContract())
            {
                var wallets = chain.GetMultiSigWallets(account);

                foreach (var wallet in wallets)
                {
                    if (context.Completed)
                    {
                        break;
                    }

                    wallet.Sign(context);
                }
            }
            else
            {
                devWallet.Sign(context);
            }

            if (!context.Completed)
            {
                throw new Exception();
            }

            tx.Witnesses = context.GetWitnesses();

            return(SubmitTransactionAsync(tx));
        }
Example #3
0
        public static JObject Sign(this ExpressWalletAccount account, byte[] data)
        {
            var(signature, publicKey) = BlockchainOperations.Sign(account, data);

            return(new JObject
            {
                ["signature"] = signature.ToHexString(),
                ["public-key"] = publicKey.ToHexString(),
                ["contract"] = new JObject
                {
                    ["script"] = account.Contract.Script,
                    ["parameters"] = new JArray(account.Contract.Parameters)
                }
            });
        }
Example #4
0
        public async Task <UInt256> ExecuteAsync(ExpressWalletAccount account, Script script, decimal additionalGas = 0)
        {
            var signers = new[] { new Signer {
                                      Scopes = WitnessScope.CalledByEntry, Account = account.AsUInt160()
                                  } };
            var factory = new TransactionManagerFactory(rpcClient);
            var tm      = await factory.MakeTransactionAsync(script, signers).ConfigureAwait(false);

            var tx = await tm
                     .AddGas(additionalGas)
                     .AddSignatures(chain, account)
                     .SignAsync()
                     .ConfigureAwait(false);

            return(await SubmitTransactionAsync(tx).ConfigureAwait(false));
        }
        public static (byte[] signature, byte[] publicKey) Sign(ExpressWalletAccount account, byte[] data)
        {
            var devAccount = DevWalletAccount.FromExpressWalletAccount(account);

            var key = devAccount.GetKey();

            if (key == null)
            {
                throw new InvalidOperationException();
            }

            var publicKey = key.PublicKey.EncodePoint(false).AsSpan().Slice(1).ToArray();
            var signature = Neo.Cryptography.Crypto.Default.Sign(data, key.PrivateKey, publicKey);

            return(signature, key.PublicKey.EncodePoint(true));
        }
Example #6
0
        public static JArray Sign(this ExpressWalletAccount account, IEnumerable <ExpressConsensusNode> nodes, JToken?json)
        {
            if (json == null)
            {
                throw new ArgumentException(nameof(json));
            }

            var data = json.Value <string>("hash-data").ToByteArray();

            // TODO: better way to identify the genesis account?
            if (account.Label == "MultiSigContract")
            {
                var hashes     = json["script-hashes"].Select(t => t.Value <string>());
                var signatures = nodes.SelectMany(n => n.Wallet.Sign(hashes, data));
                return(new JArray(signatures));
            }
            else
            {
                return(new JArray(account.Sign(data)));
            }
        }
Example #7
0
        public static Witness GetWitness(Transaction tx, ExpressChain chain, ExpressWalletAccount account)
        {
            var txHashData = Neo.Network.P2P.Helper.GetHashData(tx);
            var devAccount = DevWalletAccount.FromExpressWalletAccount(account);

            if (IsMultiSigContract(account))
            {
                // neo-express only uses multi sig contracts for consensus nodes
                var verification   = devAccount.Contract.Script;
                var signatureCount = devAccount.Contract.ParameterList.Length;

                var signatures = chain.ConsensusNodes
                                 .Select(node => DevWalletAccount.FromExpressWalletAccount(node.Wallet.DefaultAccount))
                                 .OrderBy(account => (account.GetKey() ?? throw new Exception("DevWalletAccount missing key")).PublicKey)
                                 .Select(account => Sign(txHashData, account))
                                 .Take(signatureCount)
                                 .ToList();

                var invocation = new byte[signatures.Aggregate(0, (a, sig) => a + sig.Length + 1)];

                var curPos = 0;
                for (int i = 0; i < signatures.Count; i++)
                {
                    invocation[curPos] = 0x40;
                    signatures[i].AsSpan().CopyTo(invocation.AsSpan().Slice(curPos + 1, signatures[i].Length));
                    curPos += 1 + signatures[i].Length;
                }

                return(new Witness()
                {
                    InvocationScript = invocation,
                    VerificationScript = verification,
                });
            }
            else
            {
Example #8
0
 public ExpressRpcServer(IExpressReadOnlyStore store, ExpressWalletAccount multiSigAccount)
 {
     this.store           = store;
     this.multiSigAccount = multiSigAccount;
     cacheId = DateTimeOffset.Now.Ticks.ToString();
 }
Example #9
0
        public static TransactionManager AddSignatures(this TransactionManager tm, ExpressChain chain, ExpressWalletAccount account)
        {
            if (account.IsMultiSigContract())
            {
                var signers = chain.GetMultiSigAccounts(account);

                var publicKeys = signers.Select(s => s.GetKey() !.PublicKey).ToArray();
                var sigCount   = account.Contract.Parameters.Count;

                foreach (var signer in signers.Take(sigCount))
                {
                    var keyPair = signer.GetKey() ?? throw new Exception();
                    tm = tm.AddMultiSig(keyPair, sigCount, publicKeys);
                }

                return(tm);
            }
            else
            {
                return(tm.AddSignature(account.GetKey() !));
            }
        }
Example #10
0
 private static bool IsMultiSigContract(ExpressWalletAccount account) =>
 Neo.SmartContract.Helper.IsMultiSigContract(account.Contract.Script.ToByteArray());
Example #11
0
 public static IEnumerable <DevWalletAccount> GetMultiSigAccounts(this ExpressChain chain, ExpressWalletAccount account)
 => chain.ConsensusNodes
 .Select(n => n.Wallet)
 .Concat(chain.Wallets)
 .Select(w => w.Accounts.Find(a => a.ScriptHash == account.ScriptHash))
 .Where(a => a != null)
 .Select(DevWalletAccount.FromExpressWalletAccount !);
Example #12
0
 public static UInt160 AsUInt160(this ExpressWalletAccount account) => account.ScriptHash.ToScriptHash();
Example #13
0
 public static KeyPair GetKey(this ExpressWalletAccount account) => new KeyPair(account.PrivateKey.HexToBytes());