Ejemplo n.º 1
0
        /// <summary>
        /// Derives an address and keys from given private key
        /// </summary>
        /// <param name="privKey">HEX or WIF private key to derive address from</param>
        /// <returns>An object with address and its keys in different formats</returns>
        ///
        private JObject GetAddress(string privKey)
        {
            JObject obj     = new JObject();
            KeyPair kp      = new KeyPair(privKey.ToBytePrivateKey());
            var     address = kp.AsAddress();

            obj["wif"]        = kp.Export();
            obj["address"]    = address;
            obj["privkey"]    = kp.PrivateKey.ToHexString();
            obj["pubkey"]     = kp.PublicKey.ToString();
            obj["scripthash"] = address.ToScriptHash().ToString();
            return(obj);
        }
Ejemplo n.º 2
0
        private JObject CreateAddress()
        {
            var privateKey = new byte[32];

            using (var generator = RandomNumberGenerator.Create())
            {
                generator.GetBytes(privateKey);
            }

            var kp = new KeyPair(privateKey);

            var jaddress = new JObject();

            var address = kp.AsAddress();

            jaddress["wif"]        = kp.Export();
            jaddress["address"]    = address;
            jaddress["privkey"]    = kp.PrivateKey.ToHexString();
            jaddress["pubkey"]     = kp.PublicKey.ToString();
            jaddress["scripthash"] = address.ToScriptHash().ToString();

            return(jaddress);
        }
Ejemplo n.º 3
0
        public bool CallContract(KeyPair key, string scriptHash, byte[] bytes, out byte[] txhash)
        {
            var     inputs  = new List <CoinReference>();
            var     outputs = new List <TransactionOutput>();
            decimal gasCost = 0;

            if (key != null)
            {
                var unspent = GetUnspent(key.AsAddress(), UInt256.Zero);

                if (!unspent.ContainsKey("CRON"))
                {
                    throw new RpcException(-3227, "No CRONs available");
                }

                var sources = unspent["CRON"];

                decimal selectedGas = 0;
                foreach (var src in sources)
                {
                    selectedGas += src.value;

                    var input = new CoinReference()
                    {
                        PrevHash  = UInt256.Parse(src.txid),
                        PrevIndex = (ushort)src.index,
                    };

                    inputs.Add(input);

                    if (selectedGas >= gasCost)
                    {
                        break;
                    }
                }

                if (selectedGas < gasCost)
                {
                    throw new RpcException(-3228, "Not enough CRONs available");
                }

                var targetAssetID = reverseHex(ASSET_CRON).HexToBytes();

                if (selectedGas > gasCost)
                {
                    var left = selectedGas - gasCost;

                    var change = new TransactionOutput()
                    {
                        AssetId    = new UInt256(targetAssetID),
                        ScriptHash = key.AsSignatureScript().HexToBytes().ToScriptHash(),
                        Value      = Fixed8.FromDecimal(left)
                    };
                    outputs.Add(change);
                }
            }

            InvocationTransaction tx = new InvocationTransaction()
            {
                Attributes = new TransactionAttribute[0],
                Version    = 0,
                Script     = bytes,
                Gas        = Fixed8.FromDecimal(gasCost),
                Inputs     = inputs.ToArray(),
                Outputs    = outputs.ToArray()
            };

            if (key == null)
            {
                return(CallNoInvoke(tx, out txhash));
            }


            txhash = tx.Hash.ToArray().Reverse().ToArray();

            return(SignAndRelay(tx, new[] { key }));
        }