示例#1
0
        /// <summary>
        ///     Detects a given address format without validating it.
        /// </summary>
        /// <param name="str">The address to be detected</param>
        /// <param name="format">Detected format</param>
        /// <returns>True when detection is successful, false otherwise.</returns>
        public static bool TryDetectFormat(string str, out CashFormat format)
        {
            if (!string.IsNullOrEmpty(str))
            {
                // According to Bitcoin Cash documentation, the prefix separator always exists. So, we use it as our primary guess factor.
                // Reference: https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/cashaddr.md

                var separatorIndex = str.IndexOf(':');
                if (separatorIndex >= 0)
                {
                    if (!Base32.ContainsInvalidCharacter(str, separatorIndex + 1))
                    {
                        format = CashFormat.Cashaddr;
                        return(true);
                    }
                }
                else
                {
                    if (!Base58Encoder.ContainsInvalidCharacter(str))
                    {
                        format = CashFormat.Legacy;
                        return(true);
                    }
                }
            }

            format = default;
            return(false);
        }
示例#2
0
        /// <summary>
        /// Creates a Bitcoin address step by step.
        /// </summary>
        /// <param name="publicKey"></param>
        /// <returns></returns>
        /// <remarks>
        /// See here for more details:
        /// https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses
        /// </remarks>
        public static string CreateBitcoinAddressVerbose(byte[] publicKey)
        {
            StringBuilder output = new StringBuilder();

            byte[] step1 = publicKey;
            output.AppendLine("1. public_key:\r\n" + step1.ToHex());

            byte[] step2_SHA256 = ComputeSha256(step1);
            output.AppendLine("2. SHA256(public_key):\r\n" + step2_SHA256.ToHex());

            byte[] step3_RIPEMD160 = ComputeRIPEMD160(step2_SHA256);
            output.AppendLine("3. RIPEMD160(SHA256(public_key)):\r\n" + step3_RIPEMD160.ToHex());

            byte[] step4_prepend_byte = ArrayUtils.ConcatArrays(new byte[1], step3_RIPEMD160);
            output.AppendLine("4. [0x00] + RIPEMD160(SHA256(public_key)):\r\n" + step4_prepend_byte.ToHex());

            byte[] step5_SHA256 = ComputeSha256(step4_prepend_byte);
            output.AppendLine("5. SHA256([0x00] + RIPEMD160(SHA256(public_key))):\r\n" + step5_SHA256.ToHex());

            byte[] step6_SHA256 = ComputeSha256(step5_SHA256);
            output.AppendLine("6. SHA256(SHA256([0x00] + RIPEMD160(SHA256(public_key)))):\r\n" + step6_SHA256.ToHex());

            byte[] step7_checksum = ArrayUtils.SubArray(step6_SHA256, 0, 4);
            output.AppendLine("7. checksum = First4Bytes(SHA256(SHA256([0x00] + RIPEMD160(SHA256(public_key))))):\r\n" + step7_checksum.ToHex());

            byte[] step8_BTC_address = ArrayUtils.ConcatArrays(step4_prepend_byte, step7_checksum);
            output.AppendLine("8. BTC_address = [0x00] + RIPEMD160(SHA256(public_key)) + checksum:\r\n" + step8_BTC_address.ToHex());

            string step9_Base58Check_encode = new Base58Encoder().EncodeData(step8_BTC_address);

            output.AppendLine("9. Base58CheckEncode(BTC_address):\r\n" + step9_Base58Check_encode);

            return(output.ToString());
        }
示例#3
0
        public string GetPublicAddress()
        {
            if (!string.IsNullOrWhiteSpace(_publicAddress))
            {
                return(_publicAddress);
            }

            var initaddr = _ecKey.GetPubKeyNoPrefix().ToKeccakHash();
            var address  = new byte[initaddr.Length - 11];

            Array.Copy(initaddr, 12, address, 1, 20);
            address[0] = GetPublicAddressPrefix();

            var hash  = Base58Encoder.TwiceHash(address);
            var bytes = new byte[4];

            Array.Copy(hash, bytes, 4);
            var addressChecksum = new byte[25];

            Array.Copy(address, 0, addressChecksum, 0, 21);
            Array.Copy(bytes, 0, addressChecksum, 21, 4);

            if (_network == TronNetwork.MainNet)
            {
                _publicAddress = Base58Encoder.Encode(addressChecksum);
            }
            else
            {
                _publicAddress = addressChecksum.ToHex();
            }
            return(_publicAddress);
        }
示例#4
0
        public async Task TestTransferAsync()
        {
            var transactionClient = _record.ServiceProvider.GetService <ITransactionClient>();
            var walletClient      = _record.TronClient.GetWalletClient();
            var privateKey        = "8e812436a0e3323166e1f0e8ba79e19e217b2c4a53c970d4cca0cfb1078979df";
            var tronKey           = new TronECKey(privateKey, _record.Options.Value.Network);
            var from   = tronKey.GetPublicAddress();
            var to     = "TGehVcNhud84JDCGrNHKVz9jEAVKUpbuiv";
            var amount = 1_000_000L; // 1 TRX, api only receive trx in Sun, and 1 trx = 1000000 Sun

            var fromAddress = Base58Encoder.DecodeFromBase58Check(from);
            var toAddress   = Base58Encoder.DecodeFromBase58Check(to);

            var block = await walletClient.GetNowBlock2Async(new EmptyMessage());

            var transaction = await transactionClient.CreateTransactionAsync(from, to, amount);

            Assert.True(transaction.Result.Result);

            var transactionSigned = transactionClient.GetTransactionSign(transaction.Transaction, privateKey);

            var result = await transactionClient.BroadcastTransactionAsync(transactionSigned);

            Assert.True(result.Result);
        }
示例#5
0
        private async Task <TransactionExtention> CreateTransactionAsync(string from, string to, long amount)
        {
            var fromAddress = Base58Encoder.DecodeFromBase58Check(from);
            var toAddress   = Base58Encoder.DecodeFromBase58Check(to);

            var transferContract = new TransferContract
            {
                OwnerAddress = ByteString.CopyFrom(fromAddress),
                ToAddress    = ByteString.CopyFrom(toAddress),
                Amount       = amount
            };

            var transaction = new Transaction();

            var contract = new Transaction.Types.Contract();

            try
            {
                contract.Parameter = Google.Protobuf.WellKnownTypes.Any.Pack(transferContract);
            }
            catch (Exception)
            {
                return(new TransactionExtention
                {
                    Result = new Return {
                        Result = false, Code = Return.Types.response_code.OtherError
                    },
                });
            }
            var newestBlock = await _wallet.GetNowBlock2Async(new EmptyMessage());

            contract.Type       = Transaction.Types.Contract.Types.ContractType.TransferContract;
            transaction.RawData = new Transaction.Types.raw();
            transaction.RawData.Contract.Add(contract);
            transaction.RawData.Timestamp  = DateTime.Now.Ticks;
            transaction.RawData.Expiration = newestBlock.BlockHeader.RawData.Timestamp + 10 * 60 * 60 * 1000;
            var blockHeight = newestBlock.BlockHeader.RawData.Number;
            var blockHash   = Sha256Sm3Hash.Of(newestBlock.BlockHeader.RawData.ToByteArray()).GetBytes();

            var bb = ByteBuffer.Allocate(8);

            bb.PutLong(blockHeight);

            var refBlockNum = bb.ToArray();

            transaction.RawData.RefBlockHash  = ByteString.CopyFrom(blockHash.SubArray(8, 8));
            transaction.RawData.RefBlockBytes = ByteString.CopyFrom(refBlockNum.SubArray(6, 2));

            var transactionExtension = new TransactionExtention
            {
                Transaction = transaction,
                Txid        = ByteString.CopyFromUtf8(transaction.GetTxid()),
                Result      = new Return {
                    Result = true, Code = Return.Types.response_code.Success
                },
            };

            return(transactionExtension);
        }
示例#6
0
 static Encoders()
 {
     ASCII       = new ASCIIEncoder();
     Hex         = new HexEncoder();
     Base58      = new Base58Encoder();
     Base58Check = new Base58CheckEncoder();
     Base64      = new Base64Encoder();
 }
示例#7
0
 static Encoders()
 {
     Base64 = new Base64Encoder();
     Base58Check = new Base58CheckEncoder();
     Base58 = new Base58Encoder();
     Hex = new HexEncoder();
     ASCII = new ASCIIEncoder();
 }
示例#8
0
        public async Task <decimal> BalanceOfAsync(string contractAddress, ITronAccount ownerAccount)
        {
            var contractAddressBytes = Base58Encoder.DecodeFromBase58Check(contractAddress);
            var ownerAddressBytes    = Base58Encoder.DecodeFromBase58Check(ownerAccount.Address);
            var wallet      = _walletClient.GetProtocol();
            var functionABI = ABITypedRegistry.GetFunctionABI <BalanceOfFunction>();

            try
            {
                var addressBytes = new byte[20];
                Array.Copy(ownerAddressBytes, 1, addressBytes, 0, addressBytes.Length);

                var addressBytesHex = "0x" + addressBytes.ToHex();

                var balanceOf = new BalanceOfFunction {
                    Owner = addressBytesHex
                };
                var decimals = GetDecimals(wallet, contractAddressBytes);

                var encodedHex = new FunctionCallEncoder().EncodeRequest(balanceOf, functionABI.Sha3Signature);

                var trigger = new TriggerSmartContract
                {
                    ContractAddress = ByteString.CopyFrom(contractAddressBytes),
                    OwnerAddress    = ByteString.CopyFrom(ownerAddressBytes),
                    Data            = ByteString.CopyFrom(encodedHex.HexToByteArray()),
                };

                var transactionExtention = await wallet.TriggerConstantContractAsync(trigger, headers : _walletClient.GetHeaders());

                if (!transactionExtention.Result.Result)
                {
                    throw new Exception(transactionExtention.Result.Message.ToStringUtf8());
                }
                if (transactionExtention.ConstantResult.Count == 0)
                {
                    throw new Exception($"result error, ConstantResult length=0.");
                }

                var result = new FunctionCallDecoder().DecodeFunctionOutput <BalanceOfFunctionOutput>(transactionExtention.ConstantResult[0].ToByteArray().ToHex());

                var balance = Convert.ToDecimal(result.Balance);
                if (decimals > 0)
                {
                    balance /= Convert.ToDecimal(Math.Pow(10, decimals));
                }

                return(balance);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
                throw;
            }
        }
        private static string EncodeBase58Check(byte[] input)
        {
            SHA256Managed m = new SHA256Managed();

            byte[] re = m.ComputeHash(input);
            re = m.ComputeHash(re);
            byte[] checksum = new byte[4];
            Buffer.BlockCopy(re, 0, checksum, 0, 4);
            byte[]        base58checksum = input.Concatenate(checksum);
            Base58Encoder enc            = new Base58Encoder();

            return(enc.EncodeData(base58checksum));
        }
示例#10
0
        public async Task <string> Post([FromBody] UrlViewModel model)
        {
            long number = 0;
            await counterRepository.Update(Constants.DefaultPartitionKey, Constants.DefaultRowKey,
                                           (existing) =>
            {
                existing.Count++;
                number = existing.Count;
            });

            var encodedUrl = Base58Encoder.Encode(number);
            await urlRepository.Insert(new UrlEntity(encodedUrl, model.Url));

            return(encodedUrl);
        }
示例#11
0
        private void button2_Click(object sender, EventArgs e) //记录
        {
            string data      = textBox3.Text;
            string judgedata = data.Trim();

            if (!string.IsNullOrEmpty(judgedata))
            {
                string WifPrivateKeyStr = PrivateKey;
                //string WifPrivateKeyStr = "cUvazeu9ucqD4trygt8xMEQKZfR3SZ5BdiAWb3eEwbQ48iPwYKSB";
                string uri     = bsvConfiguration_class.RestApiUri;
                string network = bsvConfiguration_class.testNetwork;
                byte[] encryptedBytes;
                //对数据先进行AES加密,再进行base58编码
                encryptedBytes = AES_class.AesEncrypt(data, WifPrivateKeyStr);
                Base58Encoder base58Encoder = new Base58Encoder();
                string        base58Str     = base58Encoder.EncodeData(encryptedBytes);
                Console.WriteLine(encryptedBytes);
                Console.WriteLine(base58Str);
                Dictionary <string, string> response;
                //发送加密数据到链上
                Task <long> gets = Task <long> .Run(() =>
                {
                    long fee, donationFee;
                    Transaction tx;
                    //response = bsvTransaction_class.send(WifPrivateKeyStr, 0, network, null, null, base58Str, 1, 0);
                    response = bsvTransaction_class.send(WifPrivateKeyStr, 0, network, out tx, out fee, out donationFee, null, null, base58Str, 1, 0);
                    Console.WriteLine("tx fee: " + fee);
                    return(fee);
                });

                textBox2.Text += data + System.Environment.NewLine;
                textBox2.Text += "\r\n";
                textBox2.Text += "------------------------------------------------------------------------------------";
                textBox2.Text += "\r\n";
                textBox2.Text += System.Environment.NewLine;
                //改变余额
                ssbalance    = ssbalance - gets.Result;
                label3.Text  = "账户余额:";
                label3.Text += ssbalance;
                label3.Text += " sat";
            }
            else
            {
                MessageBox.Show("记录不能为空!");
            }
            textBox3.Text = "";
        }
示例#12
0
        public ByteString ParseAddress(string address)
        {
            if (string.IsNullOrWhiteSpace(address))
            {
                throw new ArgumentNullException(nameof(address));
            }

            byte[] raw;
            if (address.StartsWith("T"))
            {
                raw = Base58Encoder.DecodeFromBase58Check(address);
            }
            else if (address.StartsWith("41"))
            {
                raw = address.HexToByteArray();
            }
            else if (address.StartsWith("0x"))
            {
                raw = address[2..].HexToByteArray();
示例#13
0
        public void CreaateFundingTransactionTest()
        {
            var block0  = Block.Load("0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4adae5494dffff7f20020000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000".FromHexString(), Consensus.RegTest);
            var block1  = Block.Load("0000002006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910fadbb20ea41a8423ea937e76e8151636bf6093b70eaff942930d20576600521fdc30f9858ffff7f20000000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0100f2052a010000001976a9143ca33c2e4446f4a305f23c80df8ad1afdcf652f988ac00000000".FromHexString(), Consensus.RegTest);
            var encoder = new Base58Encoder();

            var block1Privkey = new Key("6bd078650fcee8444e4e09825227b801a1ca928debb750eb36e6d56124bb20e801".FromHexString().Take(32).ToArray());

            var lightningScripts = new LightningScripts();

            byte[] localFundingPubkey  = "023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb".FromHexString();
            byte[] remoteFundingPubkey = "030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c1".FromHexString();

            byte[] script = lightningScripts.CreaateFundingTransactionScript(new PublicKey(localFundingPubkey), new PublicKey(remoteFundingPubkey));

            var trx = Transaction.Parse(
                "0200000001adbb20ea41a8423ea937e76e8151636bf6093b70eaff942930d20576600521fd000000006b48304502210090587b6201e166ad6af0227d3036a9454223d49a1f11839c1a362184340ef0240220577f7cd5cca78719405cbf1de7414ac027f0239ef6e214c90fcaab0454d84b3b012103535b32d5eb0a6ed0982a0479bbadc9868d9836f6ba94dd5a63be16d875069184ffffffff028096980000000000220020c015c4a6be010e21657068fc2e6a9d02b27ebe4d490a25846f7237f104d1a3cd20256d29010000001600143ca33c2e4446f4a305f23c80df8ad1afdcf652f900000000", NBitcoin.Network.RegTest);

            // TODO: investigate why the FeeRate is not yielding the same change as the test expects
            // TODO: also investigate why NBitcoin generates a different signature to the BOLT tests (signing the same trx on NBitcoin create the same signature payload)

            TransactionBuilder builder = NBitcoin.Network.RegTest.CreateTransactionBuilder()
                                         .AddKeys(block1Privkey)
                                         .AddCoins(new Coin(block1.Transactions[0].Outputs.AsIndexedOutputs().First()))
                                         .Send(new Script(script).GetWitScriptAddress(NBitcoin.Network.RegTest), Money.Satoshis(10000000))
                                         .SendFees(Money.Satoshis(13920).Satoshi)
                                         .SetChange(new BitcoinWitPubKeyAddress("bcrt1q8j3nctjygm62xp0j8jqdlzk34lw0v5hejct6md", NBitcoin.Network.RegTest), ChangeType.All);
            // .SendEstimatedFees(new FeeRate(Money.Satoshis(15000)));

            Transaction endtrx = builder.BuildTransaction(false, SigHash.All);

            endtrx.Version = 2;

            var trx2 = builder.SignTransactionInPlace(endtrx, SigHash.All);

            //Assert.Equal(trx.ToHex(), trx2.ToHex());

            // Check that the funding transaction scripts are equal.
            Assert.Equal(trx.Outputs[0].ScriptPubKey.ToHex(), trx2.Outputs[0].ScriptPubKey.ToHex());
        }
示例#14
0
        //登录
        private void button1_Click(object sender, EventArgs e)
        {
            string user   = textBox1.Text;
            string pwd    = textBox2.Text;
            string AESkey = user + pwd;

            while (AESkey.Length < 32)
            {
                AESkey += "1";
            }
            //打开文件获取密文

            string c = null;

            try
            {
                c = File.ReadAllText(user);
            }
            catch (Exception ex)
            {
                MessageBox.Show("获取失败!请确认您是否已注册!\n" + ex.Message);
            }

            //对密文解密
            try
            {
                //string c = File.ReadAllText("privatekey.txt");
                byte[]        encryptedBytes;
                Base58Encoder base58Encoder = new Base58Encoder();
                encryptedBytes = base58Encoder.DecodeData(c);
                string plain = AES_class.AesDecrypt(encryptedBytes, AESkey);
                //确认身份
                int    n    = plain.Length;
                int    flag = 0;
                string pkey = null;
                for (int i = 0; i < 3; i++)
                {
                    if (plain[i] != '[')
                    {
                        flag = 1;
                    }
                }
                for (int i = n - 1; i > n - 4; i--)
                {
                    if (plain[i] != ']')
                    {
                        flag = 1;
                    }
                }
                if (flag == 0)  //身份正确
                {
                    for (int i = 3; i < n - 3; i++)
                    {
                        pkey += plain[i];
                    }
                    //Console.WriteLine("私钥:" + pkey);
                    this.Hide();
                    Form1 ff = new Form1(pkey);
                    ff.ShowDialog();
                }
                else
                {
                    MessageBox.Show("登录失败!请确认用户名密码输入正确!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("登录失败!请确认用户名密码输入正确!\n" + ex.Message);
            }
        }
示例#15
0
        private void button1_Click(object sender, EventArgs e) //读取
        {
            textBox2.Text = "";
            Console.WriteLine("start get");

            string privateKeyStr = PrivateKey;
            //string privateKeyStr = "cUvazeu9ucqD4trygt8xMEQKZfR3SZ5BdiAWb3eEwbQ48iPwYKSB";
            BitcoinSecret  privateKey = new BitcoinSecret(privateKeyStr);
            Network        network    = privateKey.Network;
            PubKey         pubKey     = privateKey.PubKey;
            string         pubKeyStr  = pubKey.ToHex();
            KeyId          pkhash     = pubKey.Hash;
            string         pkhashStr  = pkhash.ToString();
            BitcoinAddress addres     = pkhash.GetAddress(network);
            string         address    = addres.ToString();
            string         networkStr = bsvConfiguration_class.testNetwork;
            string         uri        = bsvConfiguration_class.RestApiUri;

            //获取链上的交易历史
            Task <RestApiAddressHistoryTx[]> t = Task <RestApiAddressHistoryTx[]> .Run(() =>
            {
                RestApiAddressHistoryTx[] addrHistory = RestApi_class.getAddressHistory(uri, networkStr, address);
                return(addrHistory);
            });

            t.Wait();
            int num = t.Result.Length;

            Console.WriteLine("链上交易数目:" + num);
            //读取链上信息
            Task <RestApiTransaction[]> gettxs = null;

            if (num > 0)
            {
                string[] txHashs = new string[num];
                for (int i = 0; i < num; i++)
                {
                    txHashs[i] = t.Result[i].TxHash;
                }

                gettxs = Task <RestApiTransaction[]> .Run(() =>
                {
                    RestApiTransaction[] txs = RestApi_class.getTransactions(uri, networkStr, txHashs);
                    return(txs);
                });
            }

            for (int i = 0; i < num; i++)
            {
                RestApiTransaction tx = gettxs.Result[i];
                string             s  = RestApi_class.getOpReturnData(tx, bsvConfiguration_class.encoding);
                if (s != null)
                {
                    //解密
                    byte[]        encryptedBytes;
                    Base58Encoder base58Encoder = new Base58Encoder();
                    encryptedBytes = base58Encoder.DecodeData(s);
                    string data = AES_class.AesDecrypt(encryptedBytes, privateKeyStr);
                    textBox2.Text += data;
                    textBox2.Text += "\r\n";
                    textBox2.Text += System.Environment.NewLine;
                    textBox2.Text += "------------------------------------------------------------------------------------";
                    textBox2.Text += "\r\n";
                    textBox2.Text += System.Environment.NewLine;
                    Console.WriteLine("链上内容:" + s);
                }
            }
        }
示例#16
0
        public async Task <string> TransferAsync(string contractAddress, ITronAccount ownerAccount, string toAddress, decimal amount, string memo, long feeLimit)
        {
            var contractAddressBytes = Base58Encoder.DecodeFromBase58Check(contractAddress);
            var callerAddressBytes   = Base58Encoder.DecodeFromBase58Check(toAddress);
            var ownerAddressBytes    = Base58Encoder.DecodeFromBase58Check(ownerAccount.Address);
            var wallet      = _walletClient.GetProtocol();
            var functionABI = ABITypedRegistry.GetFunctionABI <TransferFunction>();

            try
            {
                var contract = await wallet.GetContractAsync(new BytesMessage
                {
                    Value = ByteString.CopyFrom(contractAddressBytes),
                }, headers : _walletClient.GetHeaders());

                var toAddressBytes = new byte[20];
                Array.Copy(callerAddressBytes, 1, toAddressBytes, 0, toAddressBytes.Length);

                var toAddressHex = "0x" + toAddressBytes.ToHex();

                var decimals = GetDecimals(wallet, contractAddressBytes);

                var tokenAmount = amount;
                if (decimals > 0)
                {
                    tokenAmount = amount * Convert.ToDecimal(Math.Pow(10, decimals));
                }

                var trc20Transfer = new TransferFunction
                {
                    To          = toAddressHex,
                    TokenAmount = Convert.ToInt64(tokenAmount),
                };

                var encodedHex = new FunctionCallEncoder().EncodeRequest(trc20Transfer, functionABI.Sha3Signature);


                var trigger = new TriggerSmartContract
                {
                    ContractAddress = ByteString.CopyFrom(contractAddressBytes),
                    OwnerAddress    = ByteString.CopyFrom(ownerAddressBytes),
                    Data            = ByteString.CopyFrom(encodedHex.HexToByteArray()),
                };

                var transactionExtention = await wallet.TriggerConstantContractAsync(trigger, headers : _walletClient.GetHeaders());

                if (!transactionExtention.Result.Result)
                {
                    _logger.LogWarning($"[transfer]transfer failed, message={transactionExtention.Result.Message.ToStringUtf8()}.");
                    return(null);
                }

                var transaction = transactionExtention.Transaction;

                if (transaction.Ret.Count > 0 && transaction.Ret[0].Ret == Transaction.Types.Result.Types.code.Failed)
                {
                    return(null);
                }

                transaction.RawData.Data     = ByteString.CopyFromUtf8(memo);
                transaction.RawData.FeeLimit = feeLimit;

                var transSign = _transactionClient.GetTransactionSign(transaction, ownerAccount.PrivateKey);

                var result = await _transactionClient.BroadcastTransactionAsync(transSign);

                return(transSign.GetTxid());
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
                return(null);
            }
        }
示例#17
0
        //注册
        private void button1_Click(object sender, EventArgs e)
        {
            label10.Text = mes;
            string user     = textBox1.Text;
            string pwd      = textBox2.Text;
            string pwd2     = textBox3.Text;
            string realname = textBox4.Text;
            string realnum  = textBox5.Text;
            string lovename = textBox6.Text;

            byte[] pk = new byte[32];
            if (user.Length != 0 && realname.Length != 0 && realnum.Length != 0) //用户名、真实姓名、证件号不能为空
            {
                if (pwd == pwd2)                                                 //确认密码
                {
                    //产生私钥
                    string AESkey = user + pwd;
                    while (AESkey.Length < 32)
                    {
                        AESkey += "1";
                    }
                    string sStr = realnum;
                    while (sStr.Length < 32)
                    {
                        sStr += "3";
                    }
                    string s = realname + realnum + lovename;
                    Console.WriteLine(AESkey);
                    Console.WriteLine(s);
                    byte[] p;
                    p = AES_class.AesEncrypt(s, sStr);
                    int n = p.Length;
                    if (n < 32)
                    {
                        for (int i = 0; i < n; i++)
                        {
                            pk[i] = p[i];
                        }
                        for (int i = n; i < 32; i++)
                        {
                            pk[i] = 1;
                        }
                    }
                    else if (n > 31)
                    {
                        for (int i = 0; i < 32; i++)
                        {
                            pk[i] = p[i];
                        }
                    }
                    Key           key        = new Key(pk);
                    BitcoinSecret privateKey = key.GetBitcoinSecret(Network.TestNet);

                    //加密私钥后写入文件
                    //string path = user+".txt";
                    string path          = user;
                    string privateKeyStr = "[[[";
                    privateKeyStr += privateKey.ToString();
                    privateKeyStr += "]]]";
                    Console.WriteLine("私钥:" + privateKeyStr);
                    byte[] APkey;
                    APkey = AES_class.AesEncrypt(privateKeyStr, AESkey);
                    Base58Encoder base58Encoder = new Base58Encoder();
                    string        base58Str     = base58Encoder.EncodeData(APkey);
                    Console.WriteLine("写入数据:" + base58Str);
                    File.WriteAllText(path, base58Str);


                    //获取地址
                    PubKey         pubKey  = privateKey.PubKey;
                    KeyId          pkhash  = pubKey.Hash;
                    BitcoinAddress addres  = pkhash.GetAddress(Network.TestNet);
                    string         address = addres.ToString();
                    MessageBox.Show("注册成功!\n请使用地址:" + address + "前往https://faucet.bitcoincloud.net/网站申领比特币。");

                    //跳转页面
                    string pkey = privateKey.ToString();
                    this.Hide();
                    Form1 ff = new Form1(pkey);
                    ff.ShowDialog();
                }
                else
                {
                    MessageBox.Show("密码输入错误!");
                }
            }
            else
            {
                MessageBox.Show("请正确输入相关信息!");
            }
        }
示例#18
0
        public void CreateManually()
        {
            Console.WriteLine();
            // Priv key length
            int KEY_SIZE = 32;

            // Max priv key value
            // 115792089237316195423570985008687907852837564279074904382605163141518161494337
            uint256 N = uint256.Parse("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141");

            // Randomizer
            Random rand = new Random();

            byte[] privateKey = new byte[KEY_SIZE];

            // Generate a valid random value
            uint256 candidateKey;

            do
            {
                rand.NextBytes(privateKey);
                candidateKey = new uint256(privateKey, false);
            } while (!(candidateKey > 0 && candidateKey < N));
            Console.WriteLine($"Private key (hex)       : { Encoders.Hex.EncodeData(privateKey) }");

            // Base58
            byte[] privKeyPrefix   = new byte[] { (128) }; // Base58 prefix for private key, 0x80 in hex
            byte[] prefixedPrivKey = Helper.Concat(privKeyPrefix, privateKey);

            Base58CheckEncoder base58Check = new Base58CheckEncoder();

            string privKeyEncoded = string.Empty;

            {
                privKeyEncoded = base58Check.EncodeData(prefixedPrivKey);
            }
            // or
            {
                var hash1    = NBitcoin.Crypto.Hashes.SHA256(prefixedPrivKey);
                var hash2    = NBitcoin.Crypto.Hashes.SHA256(hash1);
                var checksum = hash2.Take(4).ToArray();
                var prefixedPrivKeyChecksum = Helper.Concat(prefixedPrivKey, checksum);

                Base58Encoder base58 = new Base58Encoder();
                privKeyEncoded = base58.EncodeData(prefixedPrivKeyChecksum);
            }

            Assert.DoesNotThrow(() => {
                Key.Parse(privKeyEncoded, Network.Main);
            });
            Console.WriteLine($"Private key (Base58)    : {privKeyEncoded}");

            // Compressed private key
            byte[] privKeySuffix            = new byte[] { (1) }; // Suffix for compressed private key, 0x01 in hex
            byte[] suffixedPrivKey          = Helper.Concat(prefixedPrivKey, privKeySuffix);
            string compressedPrivKeyEncoded = base58Check.EncodeData(suffixedPrivKey);

            Assert.DoesNotThrow(() => {
                Key.Parse(compressedPrivKeyEncoded, Network.Main);
            });
            Console.WriteLine($"Private key (Comp.)     : {compressedPrivKeyEncoded}");

            // P2PK private key
            byte[] p2pkhPrivKeySuffix            = new byte[] { (16) }; // 0x10 in hex
            byte[] suffixedP2pkhPrivKey          = Helper.Concat(prefixedPrivKey, p2pkhPrivKeySuffix);
            string compressedP2pkhPrivKeyEncoded = base58Check.EncodeData(suffixedP2pkhPrivKey);

            Console.WriteLine($"Private key (P2PKH)     : {compressedP2pkhPrivKeyEncoded}");
        }