实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
using BitSharp.Common;
using BitSharp.Common.ExtensionMethods;
using BitSharp.Core.Domain;
using BitSharp.Core.ExtensionMethods;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
namespace BitSharp.Core
{
public class DataEncoder
{
public static UInt256 DecodeUInt256(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return reader.ReadUInt256();
}
}
public static UInt256 DecodeUInt256(UInt256 confirmedBlockHash, byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeUInt256(stream);
}
}
public static void EncodeUInt256(Stream stream, UInt256 value)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt256(value);
}
}
public static byte[] EncodeUInt256(UInt256 value)
{
using (var stream = new MemoryStream())
{
EncodeUInt256(stream, value);
return stream.ToArray();
}
}
public static Block DecodeBlock(Stream stream, UInt256? blockHash = null)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new Block
(
header: DecodeBlockHeader(stream, blockHash),
transactions: reader.ReadList(() => DecodeTransaction(stream))
);
}
}
public static Block DecodeBlock(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeBlock(stream);
}
}
public static void EncodeBlock(Stream stream, Block block)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
EncodeBlockHeader(stream, block.Header);
writer.WriteList(block.Transactions, tx => EncodeTransaction(stream, tx));
}
}
public static byte[] EncodeBlock(Block block)
{
using (var stream = new MemoryStream())
{
EncodeBlock(stream, block);
return stream.ToArray();
}
}
public static BlockHeader DecodeBlockHeader(Stream stream, UInt256? blockHash = null)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new BlockHeader
(
version: reader.ReadUInt32(),
previousBlock: reader.ReadUInt256(),
merkleRoot: reader.ReadUInt256(),
time: reader.ReadUInt32(),
bits: reader.ReadUInt32(),
nonce: reader.ReadUInt32(),
hash: blockHash
);
}
}
public static BlockHeader DecodeBlockHeader(byte[] bytes, UInt256? blockHash = null)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeBlockHeader(stream, blockHash);
}
}
public static void EncodeBlockHeader(Stream stream, BlockHeader blockHeader)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt32(blockHeader.Version);
writer.WriteUInt256(blockHeader.PreviousBlock);
writer.WriteUInt256(blockHeader.MerkleRoot);
writer.WriteUInt32(blockHeader.Time);
writer.WriteUInt32(blockHeader.Bits);
writer.WriteUInt32(blockHeader.Nonce);
}
}
public static byte[] EncodeBlockHeader(UInt32 Version, UInt256 PreviousBlock, UInt256 MerkleRoot, UInt32 Time, UInt32 Bits, UInt32 Nonce)
{
using (var stream = new MemoryStream())
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt32(Version);
writer.WriteUInt256(PreviousBlock);
writer.WriteUInt256(MerkleRoot);
writer.WriteUInt32(Time);
writer.WriteUInt32(Bits);
writer.WriteUInt32(Nonce);
return stream.ToArray();
}
}
public static byte[] EncodeBlockHeader(BlockHeader blockHeader)
{
using (var stream = new MemoryStream())
{
EncodeBlockHeader(stream, blockHeader);
return stream.ToArray();
}
}
public static BigInteger DecodeTotalWork(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
var totalWorkBytes = reader.ReadBytes(64);
return new BigInteger(totalWorkBytes);
}
}
public static BigInteger DecodeTotalWork(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeTotalWork(stream);
}
}
public static void EncodeTotalWork(Stream stream, BigInteger totalWork)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
var totalWorkBytes = totalWork.ToByteArray();
if (totalWorkBytes.Length > 64)
throw new ArgumentOutOfRangeException();
var totalWorkBytes64 = new byte[64];
Buffer.BlockCopy(totalWorkBytes, 0, totalWorkBytes64, 0, totalWorkBytes.Length);
writer.WriteBytes(totalWorkBytes64);
Debug.Assert(new BigInteger(totalWorkBytes64) == totalWork);
}
}
public static byte[] EncodeTotalWork(BigInteger totalWork)
{
using (var stream = new MemoryStream())
{
EncodeTotalWork(stream, totalWork);
return stream.ToArray();
}
}
public static ChainedHeader DecodeChainedHeader(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new ChainedHeader
(
blockHeader: DecodeBlockHeader(stream),
height: reader.ReadInt32(),
totalWork: new BigInteger(reader.ReadVarBytes())
);
}
}
public static ChainedHeader DecodeChainedHeader(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeChainedHeader(stream);
}
}
public static void EncodeChainedHeader(Stream stream, ChainedHeader chainedHeader)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
EncodeBlockHeader(stream, chainedHeader.BlockHeader);
writer.WriteInt32(chainedHeader.Height);
writer.WriteVarBytes(chainedHeader.TotalWork.ToByteArray());
}
}
public static byte[] EncodeChainedHeader(ChainedHeader chainedHeader)
{
using (var stream = new MemoryStream())
{
EncodeChainedHeader(stream, chainedHeader);
return stream.ToArray();
}
}
public static Transaction DecodeTransaction(Stream stream, UInt256? txHash = null)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new Transaction
(
version: reader.ReadUInt32(),
inputs: reader.ReadList(() => DecodeTxInput(stream)),
outputs: reader.ReadList(() => DecodeTxOutput(stream)),
lockTime: reader.ReadUInt32(),
hash: txHash
);
}
}
public static Transaction DecodeTransaction(byte[] bytes, UInt256? txHash = null)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeTransaction(stream, txHash);
}
}
public static void EncodeTransaction(Stream stream, Transaction tx)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt32(tx.Version);
writer.WriteList(tx.Inputs, input => EncodeTxInput(stream, input));
writer.WriteList(tx.Outputs, output => EncodeTxOutput(stream, output));
writer.WriteUInt32(tx.LockTime);
}
}
public static byte[] EncodeTransaction(UInt32 Version, ImmutableArray<TxInput> Inputs, ImmutableArray<TxOutput> Outputs, UInt32 LockTime)
{
using (var stream = new MemoryStream())
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt32(Version);
writer.WriteList(Inputs, input => EncodeTxInput(stream, input));
writer.WriteList(Outputs, output => EncodeTxOutput(stream, output));
writer.WriteUInt32(LockTime);
return stream.ToArray();
}
}
public static byte[] EncodeTransaction(Transaction tx)
{
using (var stream = new MemoryStream())
{
EncodeTransaction(stream, tx);
return stream.ToArray();
}
}
public static TxInput DecodeTxInput(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new TxInput
(
previousTxOutputKey: new TxOutputKey
(
txHash: reader.ReadUInt256(),
txOutputIndex: reader.ReadUInt32()
),
scriptSignature: reader.ReadVarBytes().ToImmutableArray(),
sequence: reader.ReadUInt32()
);
}
}
public static TxInput DecodeTxInput(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeTxInput(stream);
}
}
public static void EncodeTxInput(Stream stream, TxInput txInput)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt256(txInput.PreviousTxOutputKey.TxHash);
writer.WriteUInt32(txInput.PreviousTxOutputKey.TxOutputIndex);
writer.WriteVarBytes(txInput.ScriptSignature.ToArray());
writer.WriteUInt32(txInput.Sequence);
}
}
public static byte[] EncodeTxInput(TxInput txInput)
{
using (var stream = new MemoryStream())
{
EncodeTxInput(stream, txInput);
return stream.ToArray();
}
}
public static TxOutput DecodeTxOutput(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new TxOutput
(
value: reader.ReadUInt64(),
scriptPublicKey: reader.ReadVarBytes().ToImmutableArray()
);
}
}
public static TxOutput DecodeTxOutput(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeTxOutput(stream);
}
}
public static void EncodeTxOutput(Stream stream, TxOutput txOutput)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt64(txOutput.Value);
writer.WriteVarBytes(txOutput.ScriptPublicKey.ToArray());
}
}
public static byte[] EncodeTxOutput(TxOutput txOutput)
{
using (var stream = new MemoryStream())
{
EncodeTxOutput(stream, txOutput);
return stream.ToArray();
}
}
public static UnspentTx DecodeUnspentTx(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new UnspentTx(
confirmedBlockHash: reader.ReadUInt256(),
outputStates: new OutputStates(
bytes: reader.ReadVarBytes(),
length: reader.ReadInt32())
);
}
}
public static UnspentTx DecodeUnspentTx(UInt256 confirmedBlockHash, byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeUnspentTx(stream);
}
}
public static void EncodeUnspentTx(Stream stream, UnspentTx unspentTx)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt256(unspentTx.ConfirmedBlockHash);
writer.WriteVarBytes(unspentTx.OutputStates.ToByteArray());
writer.WriteInt32(unspentTx.OutputStates.Length);
}
}
public static byte[] EncodeUnspentTx(UnspentTx unspentTx)
{
using (var stream = new MemoryStream())
{
EncodeUnspentTx(stream, unspentTx);
return stream.ToArray();
}
}
public static SpentTx DecodeSpentTx(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new SpentTx(
confirmedBlockHash: reader.ReadUInt256(),
outputCount: reader.ReadInt32()
);
}
}
public static SpentTx DecodeSpentTx(UInt256 confirmedBlockHash, byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeSpentTx(stream);
}
}
public static void EncodeSpentTx(Stream stream, SpentTx spentTx)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt256(spentTx.ConfirmedBlockHash);
writer.WriteInt32(spentTx.OutputCount);
}
}
public static byte[] EncodeSpentTx(SpentTx spentTx)
{
using (var stream = new MemoryStream())
{
EncodeSpentTx(stream, spentTx);
return stream.ToArray();
}
}
public static OutputStates DecodeOutputStates(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new OutputStates
(
bytes: reader.ReadVarBytes(),
length: reader.ReadInt32()
);
}
}
public static OutputStates DecodeOutputStates(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeOutputStates(stream);
}
}
public static void EncodeOutputStates(Stream stream, OutputStates outputStates)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteVarBytes(outputStates.ToByteArray());
writer.WriteInt32(outputStates.Length);
}
}
public static byte[] EncodeOutputStates(OutputStates outputStates)
{
using (var stream = new MemoryStream())
{
EncodeOutputStates(stream, outputStates);
return stream.ToArray();
}
}
public static TxOutputKey DecodeTxOutputKey(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return new TxOutputKey
(
txHash: reader.ReadUInt256(),
txOutputIndex: reader.ReadUInt32()
);
}
}
public static TxOutputKey DecodeTxOutputKey(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeTxOutputKey(stream);
}
}
public static void EncodeTxOutputKey(Stream stream, TxOutputKey txOutputKey)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteUInt256(txOutputKey.TxHash);
writer.WriteUInt32(txOutputKey.TxOutputIndex);
}
}
public static byte[] EncodeTxOutputKey(TxOutputKey txOutputKey)
{
using (var stream = new MemoryStream())
{
EncodeTxOutputKey(stream, txOutputKey);
return stream.ToArray();
}
}
public static string DecodeVarString(Stream stream)
{
using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true))
{
return reader.ReadVarString();
}
}
public static string DecodeVarString(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
return DecodeVarString(stream);
}
}
public static void EncodeVarString(Stream stream, string s)
{
using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true))
{
writer.WriteVarString(s);
}
}
public static byte[] EncodeVarString(string s)
{
using (var stream = new MemoryStream())
{
EncodeVarString(stream, s);
return stream.ToArray();
}
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论