区块链日志程序注释
using System;
using System.Collections.Generic;
//这个声明引入了 System.Collections.Generic 命名空间,该命名空间包含泛型集合类型 List<T>,Dictionary<TKey, TValue> 和 Queue<T> 等
using BsvSimpleLibrary;
//这个声明引入了 BsvSimpleLibrary 命名空间,该命名空间包含用于处理 Bitcoin SV 的简单工具和库。BsvSimpleLibrary 属于第三方库,需要您在项目中添加该库的引用才能使用它。
using System.ComponentModel;
//这个声明引入了 System.ComponentModel 命名空间,其中包括用于数据绑定和属性管理的类
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NBitcoin;
//这个声明引入了 NBitcoin 命名空间,该命名空间是一个开源的 Bitcoin 库,提供了用于处理 Bitcoin 相关的加密、网络和协议的类和方法。
using NBitcoin.DataEncoders;
//这个声明引入了 NBitcoin.DataEncoders 命名空间,其中包含用于编码和解码 Bitcoin 数据的类和方法
using BitcoinSVCryptor;
//这个声明引入了 BitcoinSVCryptor 命名空间,该命名空间包含用于处理 Bitcoin SV 主要功能的加密、解密和签名的类和方法。该命名空间也属于第三方库,需在项目中添加该库的引用才能使用它
namespace 日记
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//事件处理程序textBox1_TextChanged其中的 textBox1_TextChanged 事件处理程序为空,该事件将在文本框的内容更改时触发
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
//事件处理程序button1_Clic事件处理程序定义了一个按钮的单击事件处理程序,该事件将在单击按钮时触发。该方法首先检查文本框是否为空,如果是,它将显示一个错误消息框。否则,它将读取文本框中的私钥字符串,并将其存储在变量 privateKeyStr 中。然后,该方法尝试将变量 privateKeyStr 中的字符串解析为 BitcoinSecret 对象,并将结果存储在变量 privateKey 中。如果无法解析该字符串,则会抛出异常。
private void button1_Click(object sender, EventArgs e)
{
if(textBox1.Text=="")
{
MessageBox.Show("私钥不能为空");
}
string privateKeyStr = textBox1.Text;
BitcoinSecret privateKey;
try
{
privateKey = new BitcoinSecret(privateKeyStr);
// 将私钥字符串转换为 BitcoinSecret 对象
string network = "";
// 定义网络类型为空字符串
if (privateKey.Network == Network.TestNet)
// 如果私钥属于测试网络
{
network = bsvConfiguration_class.testNetwork;
// 设置网络类型为测试网络
}
else if (privateKey.Network == Network.Main)
// 如果私钥属于主网络
{
network = bsvConfiguration_class.mainNetwork;
// 设置网络类型为主网络
}
else
// 如果网络类型无法区分,则弹出提示框
{
MessageBox.Show("网络错误!");
}
PubKey pubKey = privateKey.PubKey;
// 获取公钥
string pubkeyStr = pubKey.ToHex();
// 将公钥转换为 16 进制字符串
KeyId pkhash = pubKey.Hash;
// 获取公钥哈希值
string pkhashStr = pkhash.ToString();
// 将公钥哈希值转换为字符串
BitcoinAddress address = pkhash.GetAddress(privateKey.Network);
// 将比特币地址转换为字符串
string addressStr = address.ToString();
// 将比特币地址转换为字符串
string addrStr = privateKey.PubKeyHash.GetAddress(privateKey.Network).ToString();
// 获取改进的比特币地址
string destAddress = addressStr;
// 将目标地址设置为比特币地址
string uri = bsvConfiguration_class.RestApiUri;
// 获取 REST API 的 URI
Base58Encoder base58Encoder = new Base58Encoder();
// 创建 Base58Encoder 类型的对象
byte[] cipherBase58Bytes = base58Encoder.DecodeData(richTextBox3.Text);
// 将密文转换为字节数组
string plaintextStr = AES_class.AesDecrypt(cipherBase58Bytes, privateKeyStr);
// 解密密文的数据
richTextBox2.Clear();
// 清空输出文本框
richTextBox2.AppendText(plaintextStr + '\n');
// 将解密后的数据输出到输出文本框
// 创建异步任务对象
Task<RestApiAddressHistoryTx[]> addrHistoryTask = Task.Run(() =>
{
RestApiAddressHistoryTx[] addrHistory2 = RestApi_class.getAddressHistory(uri, network, addrStr);
// 获取地址历史交易记录
return addrHistory2;
// 返回地址历史交易记录数组
});
addrHistoryTask.Wait();
//等待获取比特币地址的历史交易记录的任务完成。Wait() 方法会阻塞当前线程,直到任务完成或抛出异常。
RestApiAddressHistoryTx[] addrHistory = addrHistoryTask.Result;
//获取与指定比特币地址相关的历史交易记录,并将其存储在 RestApiAddressHistoryTx 类型的数组中。Result 属性表示异步任务的返回值。在使用 Result 属性之前,需要确保异步任务已经执行完毕
List<string> txHashs = new List<string> { };
//创建一个空的字符串列表,用于存储包含 OP_RETURN 数据的交易的交易哈希值。
for (int i = 0; i < addrHistory.Length; i++)
{
txHashs.Add(addrHistory[i].TxHash);
}
//遍历比特币地址的历史交易记录,将包含 OP_RETURN 数据的交易的交易哈希值添加到字符串列表中
Task<RestApiTransaction[]> transactionsTask = Task.Run(() =>
{
RestApiTransaction[] transactionsTemp = new RestApiTransaction[txHashs.Count];
for (int i = 0; i < txHashs.Count; i++)
{
transactionsTemp[i] = RestApi_class.getTransaction(uri, network, txHashs[i]);
}
return transactionsTemp;
});
transactionsTask.Wait();
RestApiTransaction[] transactions = transactionsTask.Result;
//使用 Task.Run() 方法创建一个异步任务,获取包含 OP_RETURN 数据的交易的详细信息(即交易对象),并将其存储在 RestApiTransaction 类型的数组中。Task.Run() 方法允许代码在新的线程上执行,从而不会阻塞当前线程。使用 Wait() 方法阻塞当前线程,直到异步任务完成。最后,将获取的交易对象数组存储在 transactions 变量中
List<string> opReturnDataStrings = new List<string> { };
for (int i = 0; i < txHashs.Count; i++)
{
opReturnDataStrings.Add(RestApi_class.getOpReturnData
(transactions[i], bsvConfiguration_class.encoding));
}
//创建一个空的字符串列表,用于存储解码后的 OP_RETURN 数据。遍历所有包含 OP_RETURN 数据的交易的交易哈希值,使用 getOpReturnData() 方法获取其 OP_RETURN 数据,并将解码后的结果添加到字符串列表中
Console.WriteLine();
foreach (var opReturnDataString in opReturnDataStrings)
{
if (opReturnDataString != null)
{
try
{
byte[] tempBase58Bytes = base58Encoder.DecodeData(opReturnDataString);
richTextBox4.AppendText(opReturnDataString + '\n');
string tempDecrypt = AES_class.AesDecrypt(tempBase58Bytes, privateKeyStr);
richTextBox1.AppendText(tempDecrypt + '\n');
}
catch (Exception)
{
richTextBox1.AppendText(opReturnDataString);
}
}
}
}
//遍历所有解码后的 OP_RETURN 数据,尝试将其进行解密,并将解密后的结果显示在应用程序的富文本框中。在此过程中,将解码后的 OP_RETURN 数据和解密后的结果分别添加到两个富文本框中。如果字符串无法解码或解密,将其直接添加到富文本框中
catch (Exception)
//这是一个异常捕获语句,它表示捕获任何类型的异常。在这里,当下面的任务运行时发生异常,就会执行MessageBox.Show(“发送失败!”)语句
{
MessageBox.Show("私钥无效!");
//当私钥输入无效时,这行代码显示一个提示框告诉用户私钥无效。
}
}
private void button2_Click(object sender, EventArgs e)
{
string wifPrivateKeyStr = textBox1.Text;
//从 textBox1 窗口控件的输入中读取字符串,并把它赋值给 wifPrivateKeyStr 变量
BitcoinSecret privateKey = new BitcoinSecret(wifPrivateKeyStr);
//根据 wifPrivateKeyStr 变量值创建一个 BitcoinSecret 对象,该对象包含了钱包的私钥
string privateKeyStr = privateKey.ToString();
//把 privateKey 对象的私钥转换成字符串,并赋值给 privateKeyStr 变量
string plaintextStr = richTextBox2.Text;
//:从 richTextBox2 控件的输入中读取字符串,并把它赋值给 plaintextStr 变量
byte[] aesEncryptedTextBytes = AES_class.AesEncrypt(plaintextStr, privateKeyStr);
//使用 AES 加密算法加密 plaintextStr 变量,并用 privateKeyStr 变量作为加密密钥,最终生成一个加密的字节数组,该数组赋值给 aesEncryptedTextBytes 变量
Base58Encoder base58Encoder = new Base58Encoder();
//创建一个 Base58Encoder 对象用于将字节数组转换成 Base58 编码的字符串
string base58TextData = base58Encoder.EncodeData(aesEncryptedTextBytes);
//把 aesEncryptedTextBytes 变量转换成 Base58 编码的字符串,并赋值给 base58TextData 变量
string network = string.Empty;
if (privateKey.Network == Network.TestNet)
//检查 privateKey 对象所在的网络是不是 TestNet,如果是,就把 bsvConfiguration_class.testNetwork 赋值给 network 变量
{
network = bsvConfiguration_class.testNetwork;
}
else if (privateKey.Network == Network.Main)
//检查 privateKey 对象所在的网络是不是 MainNet,如果是,就把 bsvConfiguration_class.mainNetwork 赋值给 network 变量
{
network = bsvConfiguration_class.mainNetwork;
}
else
{
MessageBox.Show("网络错误!");
}
string destAddress = privateKey.PubKeyHash.GetAddress(privateKey.Network).ToString();
//根据 privateKey 对象获取其公钥哈希值,并把这个哈希值转换成地址字符串,并赋值给 destAddress 变量
try
{//创建一个异步任务,该任务运行 send 方法,这个方法将加密信息发送给指定的地址
Task<Dictionary<string, string>> sendTask = Task.Run(() =>
{
Dictionary<string, string> response = bsvTransaction_class.send(privateKeyStr, 0, network, destAddress, null, base58TextData, 0.5, 0);
//执行 bsvTransaction_class 类的 send 方法,并把方法的返回值赋值给 response 变量
return response;
});
sendTask.Wait();
//等待异步任务完成
}
catch (Exception)
{
MessageBox.Show("发送失败!");
}
richTextBox3.Clear();
richTextBox3.Text += base58TextData;
//加密后的信息追加显示在 richTextBox3 控件中
richTextBox1.AppendText(plaintextStr+'\n');
//明文追加显示在 richTextBox1 控件中
}
// 当richTextBox1的文字改变时,触发该事件处理程序方法
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
}
// 当richTextBox4的文字改变时,触发该事件处理程序方法
private void richTextBox4_TextChanged(object sender, EventArgs e)
{
}
// 当richTextBox4的文字改变时,触发该事件处理程序方法,这个是在设计器中另外添加的文字改变事件处理程序方法
private void richTextBox4_TextChanged_1(object sender, EventArgs e)
{
}
// 当用户点击label5时,触发该事件处理程序方法
private void label5_Click(object sender, EventArgs e)
{
}
}
}