/// <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); }
/// <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()); }
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); }
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); }
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); }
static Encoders() { ASCII = new ASCIIEncoder(); Hex = new HexEncoder(); Base58 = new Base58Encoder(); Base58Check = new Base58CheckEncoder(); Base64 = new Base64Encoder(); }
static Encoders() { Base64 = new Base64Encoder(); Base58Check = new Base58CheckEncoder(); Base58 = new Base58Encoder(); Hex = new HexEncoder(); ASCII = new ASCIIEncoder(); }
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)); }
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); }
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 = ""; }
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();
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()); }
//登录 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); } }
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); } } }
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); } }
//注册 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("请正确输入相关信息!"); } }
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}"); }