Blockchain in C#/.NET for on-chain, decentralized gaming
LGPL-2.1 License
Bot releases are visible (Hide)
Published by github-actions[bot] almost 3 years ago
Released on December 5, 2021.
ITransport.MessageHistory
property due to memory leak. [#1638]
Published by github-actions[bot] almost 3 years ago
Published by github-actions[bot] almost 3 years ago
Released on November 30, 2021.
Transaction<T>.BytesLength
property. [#1609]
Block<T>.BytesLength
property. [#1609]
BlockChain<T>.MineBlock()
overloaded methods' maxBlockBytes
parameters became long?
(were int?
). [#1609]
IBlockPolicy<T>.GetMaxBlockBytes(long)
method became long
(was int
). [#1609]
BlockPolicy<T>()
constructor's getMaxBlockBytes
parameter became Func<long, long>?
(was Func<long, int>?
). [#1609]
InvalidBlockBytesLengthException()
constructor's bytesLength
parameter became long
(was int
). [#1609]
InvalidBlockBytesLengthException.BytesLength
property became long
(was int
). [#1609]
IsEmpty()
and IsFull()
of KBucket
changed to properties IsEmpty
and IsFull
respectively. [#1610]
MessageCodec
class renamed to TcpMessageCodec
. [#1610]
lifetime
parameter removed from IMessageCodec.Decode()
. messageLifespan
parameter added to constructors of NetMQMessageCodec
and TcpMessageCodec
. [#1610]
PeerStates
property from Swarm<T>
. [#1610]
BoundPeer.QueryAppProtocolVersion()
changed to BoundPeer.QueryAppProtocolVersionNetMQ()
. [#1610]
Swarm<T>
became to append blocks to forked chain to avoid locking the canonical chain while syncing recent blocks. [#1606]
Metric
. [#1627]
InvalidMagicCookieException
and InvalidTimestampException
can now be serialized and deserialized. [#1613]
PolymorphicAction<T>
had thrown InvalidCastException
when inner action's .PlainValue
returns other value than Bencodex.Types.Dictionary
. [#1628]
Published by github-actions[bot] almost 3 years ago
Released on November 25, 2021.
planet apv query
command became to communicate with NetMQTransport
instead of TcpTransport
. [#1618]
Published by github-actions[bot] almost 3 years ago
Released on November 25, 2021.
Published by github-actions[bot] almost 3 years ago
Released on November 16, 2021.
MonoRocksDBStore
class. [#1513, #1579]
rehearsal
parameter from ITrie.Commit()
method. [#1554, #1570]
rehearsal
parameter from StateStoreExtensions.Commit()
extension method. [#1554, #1570]
ITransport.RunAsync()
method. ITransport.StartAsync()
now conducts operation that ITransport.RunAsync()
used to conduct. [#1523]
ITransport.ReplyMessage()
method which was non-blocking. Instead, added ITransport.ReplyMessageAsync()
asynchronous method which is awaited until the reply message is sent. [#1523]
ITransport.ProcessMessageHandler
became AsyncDelegate<T>
(which was EventHandler
). [#1523]
BlockChain<T>
type parameter from IStagePolicy<T>.Iterate()
method. [#1553, #1556]
HashAlgorithmTable
class. [#1600]
BlockChain<T>.MineBlock()
and BlockChain<T>.GatherTransactionsToMine()
now additionally accepts maxBlockBytes
parameter of type int
. [#1600]
BlockInsufficientTxsException
and BlockExceedingTransactionsException
classes. [#1504, #1600]
ITransport.MessageHistory
property. [#1523]
ITransport.WaitForRunning()
method. [#1523]
TcpTransport
class which implements ITransport
interface. [#1523]
SwarmOptions.Type
property. [#1523]
SwarmOptions.TransportType
enum. [#1523]
AsyncDelegate<T>
class. [#1523]
InvalidMagicCookieException
class. [#1523]
MessageCodec
class which inherits IMessageCodec<T>
. [#1523]
IStagePolicy<T>.GetNextTxNonce()
method. [#1553, #1556]
InvalidBlockBytesLengthException
, InvalidBlockTxCountException
, InvalidBlockHashAlgorithmTypeException
, and InvalidBlockTxCountPerSignerException
classes. [#1504, #1600]
MerkleTrie.Commit()
and BlockChain<T>.ExecuteActions()
methods. [#1554, #1570]
Swarm<T>.MineBlock()
now throws OperationCanceledException
instead of BlockInsufficientTxsException
when there are no sufficient number of blocks to mine. [#1600]
BlockPolicy<T>.ValidateNextBlock()
of IBlockPolicy<T>
now validates the type for Block<T>.HashAlgorithm
, size for Block<T>.BytesLength
, and count for Block<T>.Transactions
. [#1504, #1600]
Published by github-actions[bot] almost 3 years ago
Released on November 9, 2021.
DefaultStore.ForkBlockIndexes()
method's bug that it had been thrown ChainIdNotFoundException
when received a chain forked from already deleted. [#1591, #1592]
BlockExceedingTransactionsException
InvalidBlockBytesLengthException
in regards to serialization and related tests. [#1594]Published by github-actions[bot] almost 3 years ago
Released on November 8, 2021.
Swarm<T>
became to broadcast a new block to peers immediately after Swarm<T>.BlockChain
's Tip
changes while it is Running
. [#1582]
Published by github-actions[bot] almost 3 years ago
Released on November 8, 2021.
Swarm<T>
became to broadcast a new block to peers immediately after Swarm<T>.BlockChain
's Tip
changes while it is Running
. [#1582]
Published by github-actions[bot] almost 3 years ago
Published by github-actions[bot] almost 3 years ago
Released on November 3, 2021.
PrivateKey(IReadOnlyList<byte>)
overloaded constructor no more accepts a list shorter or longer than 32 bytes. [#1571, #1572]
PrivateKey.FromString()
method no more accept a hexadecimal digits shorter or longer than 64 characters. [#1571, #1572]
HashAlgorithmType.Digest(byte[])
and HashAlgorithmType.Digest(ImmutableArray<byte>)
methods had returned a wrong hash digest after HashAlgorithmType.Digest(IEnumerable<byte[]>)
or HashAlgorithmType.Digest(IEnumerable<ImmutableArray<byte>>)
methods had been once called. [#1575, #1576]
Published by github-actions[bot] almost 3 years ago
Released on November 3, 2021.
HashAlgorithmType.Digest(byte[])
and HashAlgorithmType.Digest(ImmutableArray<byte>)
methods had returned a wrong hash digest after HashAlgorithmType.Digest(IEnumerable<byte[]>)
or HashAlgorithmType.Digest(IEnumerable<ImmutableArray<byte>>)
methods had been once called. [#1575]
Published by github-actions[bot] almost 3 years ago
Released on November 2, 2021.
PrivateKey(IReadOnlyList<byte>)
overloaded constructor no more accepts a list shorter or longer than 32 bytes. [[#1571]]
PrivateKey.FromString()
method no more accept a hexadecimal digits shorter or longer than 64 characters. [[#1571]]
Published by github-actions[bot] almost 3 years ago
Released on October 29, 2021.
BlockMetadata.MineNonce()
method and other mining methods based on it now do not spawn a new thread if the workers
is less than 2. [#1564]
BlockMetadata.MineNonce()
method and other mining methods based on it now uses the half of the present logical processors (i.e., Environment.ProcessorCount / 2
) by default. If there is only one logical processor, uses one worker. [#1564]
Message
so that it is compatible with nodes based on Libplanet pre-0.19.0. [#1565]
Published by github-actions[bot] almost 3 years ago
Released on October 28, 2021. Mainly backported critical bug fixes from 0.19.0. [#1562]
Swarm<T>.StartAsync()
method became to poll neighbor peers if they have any new blocks whether Swarm<T>.BlockDemandTable
is empty or not. The polling is triggered when Swarm<T>.BlockChain
's Tip
has been unchanged for a while. [#1557]
Swarm<T>
's bug that it had thrown PingTimeoutException
if any peer in configured SwarmOptions.StaticPeers
is unreachable. [#1550, #1551]
Swarm<T>
did not removed failed block demands from the BlockDemandTable
. [#1549]
Published by github-actions[bot] almost 3 years ago
Released on October 27, 2021.
IStore.StageTransactionIds()
method. [#1166, #1535]
IStore.UnstageTransactionIds()
method. [#1166, #1535]
IStore.IterateStagedTransactionIds()
method. [#1166, #1535]
Message.ToNetMQMessage()
method. Use IMessageCodec<T>.Encode()
method instead. [#1503]
Message.Parse()
static method. Use IMessageCodec<T>.Decode()
method instead. [#1503]
HashAlgorithmGetter
type parameter from ActionEvaluator<T>()
constructor. [#1537]
Hashcash.Answer()
method became to take random seed
value explicitly. [#1546]
NetMQMessage
has been modified. [#1503]
BlockMetadata.MineNonce(HashAlgorithmType, int, CancellationToken)
overloaded method. [#1546]
Message.MessageFrame
enum. [#1503]
Message.Type
property. [#1503]
Message.DataFrames
property. [#1503]
IMessageCodec<T>
interface. [#1503]
NetMQMessageCodec
class which inherits IMessageCodec<T>
. [#1503]
MemoryStore
class. [#1544]
MemoryKeyValueStore
class. [#1544]
BlockDemandTable.Remove()
method. [#1549]
SwarmOptions.TipLifespan
property. [#1557]
BlockMetadata.MineNonce()
method became to use multithreading when looking for the nonce. [#1546]
IStore.ForkTxNonces()
method became to throw ChainIdNotFoundException
when a given sourceChainId
does not exist. [#1544]
Swarm<T>.StartAsync()
method became to poll neighbor peers if they have any new blocks whether Swarm<T>.BlockDemandTable
is empty or not. The polling is triggered when Swarm<T>.BlockChain
's Tip
has been unchanged for a while. Expiration time for tips can be configured through SwarmOptions.TipLifespan
property. [#1557]
DefaultStore.ForkBlockIndexes()
method's bug that it had done silently no-op when a given sourceChainId
had not existed, which had not been compliant with IStore.ForkBlockIndexes()
method's specification. [#1544]
Swarm<T>
's bug that it had thrown PingTimeoutException
if any peer in configured SwarmOptions.StaticPeers
is unreachable. [#1550, #1551]
RocksDBStore.ForkBlockIndexes()
method's bug that it had done silently no-op when a given sourceChainId
had not existed, which had not been compliant with IStore.ForkBlockIndexes()
method's specification. [#1544]
MonoRocksDBStore.ForkBlockIndexes()
method's bug that it had done silently no-op when a given sourceChainId
had not existed, which had not been compliant with IStore.ForkBlockIndexes()
method's specification. [#1544]
Swarm<T>
did not removed failed block demands from the BlockDemandTable
. [#1549]
Published by github-actions[bot] almost 3 years ago
Released on October 22, 2021.
Swarm<T>
had not responded to GetBlocks
requests when some of requested blocks fail to be loaded. It now sends a Blocks
response with successfully loaded blocks for the same situation. [#1540]
Published by github-actions[bot] almost 3 years ago
Released on October 21, 2021.
PublicKey.Verify()
method had thrown exceptions for some invalid inputs. [#1520]
BaseStore.GetBlock<T>()
method now throws InvalidOperationException
when it fails to load a requested block's transactions. [#1500, #1532]
RocksDBStore
that update data no longer suppress the internal failures. [#1500, #1532]
Published by github-actions[bot] about 3 years ago
Released on October 13, 2021.
Hashcash.Stamp(Nonce)
delegate's return type became IEnumerable<byte[]>
(was byte[]
). [#1492]
BlockDigest
struct to Libplanet.Store
namespace (from Libplanet.Blocks
namespace). [#1492]
Block<T>.ToBlockDigest()
method. Use BlockDigest.FromBlock<T>()
static method instead. [#1492]
ActionEvaluator<T>.Evaluate()
method's block
parameter became to take IPreEvaluationBlock<T>
(was IBlock<T>
). [#1146, #1164, #1492]
Block<T>
and BlockHeader
now guarantees that their every instance has integrity. [#1164, #1492]
Block<T>
became unable to be subclassed.Block<T>(long, long, BigInteger, Nonce, Address, BlockHash?, DateTimeOffset, IReadOnlyList<Transaction<T>>, HashAlgorithmType, HashDigest<SHA256>, ImmutableArray<byte>?, int)
overloaded constructor. Use other overloaded constructors instead.Block<T>(IBlockHeader header, IEnumerable<Transaction<T>>)
overloaded constructor.Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>, ImmutableArray<byte>?)
overloaded constructor. [#1457, #1507]
BlockHeader
is no more readonly struct, but a sealed class.BlockHeader(int, long, string, ImmutableArray<byte>, ImmutableArray<byte>, long, BigInteger, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>)
constructor. Use other overloaded constructors instead.BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?)
overloaded constructor. [#1457, #1507]
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?, BlockHash)
overloaded constructor. [#1457, #1507]
Block<T>
and BlockHeader
have no more marshaling/unmarshaling methods.
Block<T>(Bencodex.Types.Dictionary)
overloaded constructor. Use BlockMarshaler.UnmarshalBlock()
static method instead.Block<T>.Deserialize()
static method. Instead, use BlockMarshaler.UnmarshalBlock()
static method and Bencodex.Codec
together.Block<T>.ToBencodex()
method. Use BlockMarshaler.MarshalBlock()
static method instead.Block<T>.Serialize()
method. Instead, use BlockMarshaler.MarshalBlock()
static method and Bencodex.Codec
together.BlockHeader(Bencodex.Types.Dictionary)
overloaded constructor. Use BlockMarshaler.UnmarshalBlockHeader()
static method instead.BlockHeader.Deserialize()
static method. Instead, use BlockMarshaler.UnmarshalBlockHeader()
static method and Bencodex.Codec
together.BlockHeader.ToBencodex()
method. Use BlockMarshaler.MarshalBlockHeader()
static method instead.BlockHeader.Serialize()
method. Instead, use BlockMarshaler.MarshalBlockHeader()
static method and Bencodex.Codec
together.Block<T>
and BlockHeader
now guarantee that their every instance has its StateRootHash
. [#1128, #1146, #1492]
Block<T>.StateRootHash
property's type became HashDigest<SHA256>
(was HashDigest<SHA256>?
).Block<T>(Block<T>, HashDigest<SHA256>)
overloaded constructor. Use Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>)
overloaded constructor instead.Block<T>.Mine()
static method. Use BlockContent<T>.Mine()
and PreEvaluationBlock<T>.Evaluate()
methods instead.BlockHeader.StateRootHash
property's type became HashDigest<SHA256>
(was HashDigest<SHA256>?
).InvalidBlockStateRootHashException()
constructor's expectedStateRootHash
parameter became HashDigest<SHA256>
(was HashDigest<SHA256>?
). [#1507]
InvalidBlockStateRootHashException.ExpectedStateRootHash
property's type became HashDigest<SHA256>
(was HashDigest<SHA256>?
). [#1507]
Block<T>
and BlockHeader
became aware of HashAlgorithmType
used for proof-of-work mining. [#1492]
Block<T>.HashAlgorithm
property.BlockHeader.HashAlgorithm
property.BlockHeader(int, long, DateTimeOffset, Nonce, Address, long, BigInteger, BlockHash?, HashDigest<SHA256>?, BlockHash, ImmutableArray<byte>, HashDigest<SHA256>?)
constructor. Use BlockHeader(int, long, DateTimeOffset, Nonce, Address, long, BigInteger, BlockHash?, HashDigest<SHA256>?, BlockHash, ImmutableArray<byte>, HashDigest<SHA256>, HashAlgorithmType)
constructor instead.HashAlgorithmGetter hashAlgorithmGetter
parameter to IStore.GetBlock<T>()
method.BlockDigest.Header
property. Use BlockDigest.GetHeader()
method instead.BlockDigest.GetHeader()
method.HashAlgorithmGetter hashAlgorithmGetter
parameter to DelayedRenderer<T>()
constructor.HashAlgorithmGetter hashAlgorithmGetter
parameter to DelayedActionRenderer<T>()
constructor.DelayedRenderer<T>.HashAlgorithmGetter
property.Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>, ImmutableArray<byte>?)
overloaded constructor. [#1164, #1492]
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?)
overloaded constructor. [#1164, #1492]
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?, BlockHash)
overloaded constructor. [#1164, #1492]
Block<T>.Signature
property.Block<T>.PublicKey
property.BlockHeader.Signature
property.BlockHeader.PublicKey
property.InvalidBlockPublicKeyException
class.InvalidBlockSignatureException
class.IStateStore
now requires implementations to be trie. [#1128, #1146, #1492]
IStateStore.GetStateRoot()
method.IStateStore.PruneStates()
method.IStateStore.SetStates<T>()
method.IStateStore.GetState()
method.IStateStore.ContainsBlockStates()
method.IStateStore.ForkStates<T>()
method.TrieStateStore
no more stores associations between Block<T>.Hash
/Block<T>.PreEvaluationHash
and Block<T>.StateRootHash
, because Block<T>.StateRootHash
became mandatory. [#1128, #1146, #1492]
ITrie.Recorded
property.IKeyValueStore stateHashKeyValueStore
parameter from TrieStateStore()
constructor.TrieStateStore.GetTrie()
method.TrieStateStore.GetRootHash()
method.TrieStateStore.PruneStates(IImmutableSet<BlockHash>)
method with TrieStateStore.PruneStates(IImmutableSet<HashDigest<SHA256>>)
method.BlockChain<T>.MineBlock()
overloaded methods' miner
parameter became PrivateKey
(were Address
). [#1457, #1507]
Block<T>.CurrentProtocolVersion
is bumped from 1 to 2: [#1507]
BlockMetadata
class. [#1164, #1457, #1492, #1507]
BlockContent<T>
class. [#1164, #1492]
PreEvaluationBlockHeader
class. [#1146, #1164, #1457, #1492, #1507]
PreEvaluationBlock<T>
class. [#1146, #1164, #1457, #1492, #1507]
BlockDigest.FromBlock<T>()
static method. [#1492]
Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>)
overloaded constructor. [#1146, #1164, #1492]
Block<T>.HashAlgorithm
property. [#1492]
Block<T>.PublicKey
property. [#1457, #1507]
Block<T>.Signature
property. [#1457, #1507]
Block<T>(PreEvaluationBlock<T>, HashDigest<SHA256>, ImmutableArray<byte>?)
overloaded constructor. [#1164, #1457, #1492, #1507]
Block<T>(IBlockHeader, IEnumerable<Transaction<T>>)
overloaded constructor. [#1164, #1492]
BlockHeader.HashAlgorithm
property. [#1492]
BlockHeader.PublicKey
property. [#1457, #1507]
BlockHeader.Signature
property. [#1457, #1507]
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?)
overloaded constructor. [#1164, #1457, #1492, #1507]
BlockHeader(PreEvaluationBlockHeader, HashDigest<SHA256>, ImmutableArray<byte>?, BlockHash)
overloaded constructor. [#1164, #1457, #1492, #1507]
IBlockMetadata
interface. [#1164, #1457, #1492, #1507]
Block<T>
became to implement IBlockMetadata
interface.BlockHeader
became to implement IBlockMetadata
interface.BlockMetadata
became to implement IBlockMetadata
interface.BlockContent<T>
became to implement IBlockMetadata
interface.PreEvaluationBlockHeader
became to implement IBlockMetadata
interface.PreEvaluationBlock<T>
became to implement IBlockMetadata
interface.BlockDigest
became to implement IBlockMetadata
interface.IBlockContent<T>
interface. [#1164, #1492]
Block<T>
became to implement IBlockContent<T>
interface.BlockContent<T>
became to implement IBlockContent<T>
interface.PreEvaluationBlock<T>
became to implement IBlockContent<T>
interface.IPreEvaluationBlockHeader
interface. [#1164, #1492]
Block<T>
became to implement IPreEvaluationBlockHeader
interface.BlockHeader
became to implement IPreEvaluationBlockHeader
interface.PreEvaluationBlockHeader
became to implement IPreEvaluationBlockHeader
interface.PreEvaluationBlock<T>
became to implement IPreEvaluationBlockHeader
interface.IPreEvaluationBlock<T>
interface. [#1164, #1492]
Block<T>
became to implement IPreEvaluationBlock<T>
interface.PreEvaluationBlock<T>
became to implement IPreEvaluationBlock<T>
interface.ActionEvaluator<T>.Evaluate()
method's block
parameter became to take IPreEvaluationBlock<T>
(was IBlock<T>
).IBlockHeader
interface. [#1146, #1164, #1492]
Block<T>
became to implement IBlockHeader
interface.BlockHeader
became to implement BlockHeader
interface.BlockMetadataExtensions
static class. [#1164, #1492]
BlockContentExtensions
static class. [#1164, #1492]
BlockMarshaler
static class. [#1164, #1492]
BlockDigest.GetHeader()
method. [#1492]
StateStoreExtensions
static class. [#1128, #1146, #1492]
StoreExtensions.GetStateRootHash()
extension method. [#1128, #1146, #1492]
DelayedRenderer<T>.HashAlgorithmGetter
property. [#1492]
BlockDigest
became to implement IBlockExcerpt
. [#1492]
InvalidBlockPublicKeyException
class. [#1457, #1507]
InvalidBlockSignatureException
class. [#1457, #1507]
Block<T>.Transactions
property is now ordered by Transaction<T>.Id
so that it's consistent with IBlockContent<T>
's other implementations. As this behavior can be changed in the later releases, do not depend on its ordering, but explicitly sort them before use when the order needs to b guaranteed. [#1492]
InvalidBlockPublicKeyException
is thrown. [#1457, #1507]
PublicKey.ToString()
method now returns its hexadecimal representation in compressed form. [#1507]
Published by github-actions[bot] about 3 years ago
Released on September 28, 2021.
StateCompleterSet<T>.ComplementAll
property. [#1358, #1386]
StateCompleterSet<T>.ComplementLatest
property. [#1358, #1386]
BlockPerception
now implements IBlockExcerpt
interface. [#1440]
BlockPerception.Excerpt
property removed.TotalDifficultyComparer
now implements IComparer<IBlockExcerpt>
interface. [#1442]
BlockDemandTable.Add()
is now void
. [#1435, #1443]
BlockInsufficientTxsException
. [#1445]
PrivateKey()
constructor's parameter type became IReadOnlyList<byte>
(was byte[]
). [#1464]
PrivateKey.ByteArray
property's type became ImmutableArray<byte>
(was byte[]
). To get a mutable one, use PrivateKey.ToByteArray()
method instead. [#1464]
PublicKey()
constructor's parameter type became IReadOnlyList<byte>
(was byte[]
). [#1464]
PublicKey.Verify()
method's both parameter types became IReadOnlyList<byte>
(were both byte[]
). [#1464]
HashDigest<T>.DeriveFrom()
method's parameter type became IReadOnlyList<byte>
(was byte[]
). [#1464]
IBlockPolicy<T>.GetMaxBlockBytes()
description changed for 0
and negative values. [#1449, #1463]
BlockChain<T>
.IBlockPolicy<T>.MaxTransactionsPerBlock
property. It is replaced by IBlockPolicy<T>.GetMaxTransactionsPerBlock(long index)
method. [#1447]
IBlockPolicy<T>.GetMaxTransactionsPerBlock(long index)
method. [#1447]
IBlockPolicy<T>.GetMinTransactionsPerBlock(long index)
method. [#1479]
IBlockPolicy<T>.GetMaxTransactionsPerSignerPerBlock(long index)
method. [#1449, #1463]
currentTime
removed from BlockChain<T>.Append()
. [#1462, #1465]
maxTransactionsPerSigner
parameter to BlockChain<T>.MineBlock()
method. [#1449, #1463]
txPriority
parameter to BlockChain<T>.MineBlock()
method. [#1477]
BlockHeader
's properties are now represented as richer types than before. [#1470]
BlockHeader.Timestamp
property's type became DateTimeOffset
(was string
).BlockHeader.Nonce
property's type became Nonce
(was ImmutableArray<byte>
).BlockHeader.Miner
property's type became Address
(was ImmutableArray<byte>
).BlockHeader.PreviousHash
property's type became BlockHash?
(was ImmutableArray<byte>
).BlockHeader.TxHash
property's type became HashDigest<SHA256>?
(was ImmutableArray<byte>
).BlockHeader.Hash
property's type became BlockHash
(was ImmutableArray<byte>
).BlockHeader.StateRootHash
property's type became HashDigest<SHA256>?
(was ImmutableArray<byte>
).BlockHeader(int, long, string, ImmutableArray<byte>, ImmutableArray<byte>, long, BigInteger, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>, ImmutableArray<byte>)
constructor. Use BlockHeader(int, long, DateTimeOffset, Nonce, Address, long, BigInteger, BlockHash?, HashDigest<SHA256>?, BlockHash, ImmutableArray<byte>, HashDigest<SHA256>?)
constructor instead.IStore
, IStateStore
, and IKeyValueStore
interfaces now inherit IDisposable
. [#1448, #1474]
IBlockPolicy<T>
interface. [#1485]
bool DoesTransactionFollowsPolicy(BlockChain<T>, Transaction<T>)
changed to TxPolicyViolationException? ValidateNextBlockTx( BlockChain<T>, Transaction<T>)
.InvalidBlockException ValidateNextBlock(BlockChain<T>, Block<T>)
changed to BlockPolicyViolationException? ValidateNextBlock( BlockChain<T>, Block<T>)
.BlockPolicy<T>
, the default implementation for IBlockPolicy<T>
, has been updated accordingly.BlockPolicy<T>()
constructor with int blockIntervalMilliseconds
parameter. Use the one with TimeSpan? blockInterval
instead. [#1485]
int maxBlockBytes
and int maxGenesisBytes
parameters from BlockPolicy<T>()
constructor with Func<long, int>? getMaxBlockBytes
. [#1485]
TxViolatingBlockPolicyException
class. [#1485]
difficultyBoundDivisor
for BlockPolicy<T>()
constructor changed to difficultyStability
. [#1495]
difficultyStability
for BlockPolicy<T>()
constructor changed to long?
from int?
. [#1495]
Message
became to serialize peer with Bencodex instead of BinaryFormatter
. [#1455]
IBlockExcerpt.ExcerptEquals
extension method added. [#1440]
PrivateKey.FromString()
method. [#1475]
PrivateKey.Sign(ImmutableArray<byte>)
overloaded method. [#1464]
PrivateKey.Decrypt(ImmutableArray<byte>)
overloaded method. [#1464]
PrivateKey.ToByteArray()
method. [#1464]
PublicKey.Encrypt(ImmutableArray<byte>)
overloaded method. [#1464]
PublicKey.ToImmutableArray()
method. [#1464]
Nonce(ImmutableArray<byte>)
overloaded constructor. [#1464]
HashAlgorithmType.Digest(IEnumerable<byte[]>)
overloaded method. [#1480]
HashAlgorithmType.Digest(IEnumerable<ImmutableArray<byte>>)
overloaded method. [#1480]
BlockHeader(int, long, DateTimeOffset, Nonce, Address, long, BigInteger, BlockHash?, HashDigest<SHA256>?, BlockHash, ImmutableArray<byte>, HashDigest<SHA256>?)
constructor. [#1470]
TxCompletion<TPeer, TAction>
class. [#1420, #1478]
BlockPolicyViolationException
and TxPolicyViolationException
classes. [#1485]
DifficultyAdjustment
static class. [#1495]
BlockPolicy<T>.DifficultyStability
and BlockPolicy<T>.MinimumDifficulty
properties. [#1495]
StateCompleterSet<T>.Recalculate
now evaluates states even for those already in IStateStore
. Moreover, it also terminates early if possible after reaching the BlockHash
provided with a call. [#1358, #1386]
TotalDifficultyComparer
no longer considers perceived time when comparing IBlockExcerpt
s. [#1442]
BlockDemandTable
in order to decide whether BlockDemand
is stale or not. This should prevent a tip regression for a local node, as the tip of a chain is never considered as stale.BlockDemand
became not to fill blocks from multiple peers. [#1459]
BlockChain<T>.MineBlock()
now uses maxTransactions
literally. [#1449, #1463]
maxTransactions
were internally automatically set to a value between 1
and BlockChain<T>.Policy.MaxTransactionsPerBlock
.BlockChain<T>.MineBlock()
now internally uses BlockChain<T>.Policy.GetMaxBlockBytes()
literally. [#1449, #1463]
NetMQTransport
became to no more send CreatePermission to TURN client and require permission-less TURN server. See coturn's relevant configuration as well. [#1423]
Swarm<T>
became to sync transactions from multiple peers at the same time. [#1420, #1478]
targetBlockInterval
(changed from the old name blockInterval
), minimumDifficulty
, and difficultyStability
(changed from the old name difficultyBoundDivisor
) arguments given to BlockPolicy<T>()
constructor fixed. [#1495]
targetBlockInterval
to be zero, which would result in division by zero, when this makes no sense.difficultyStability
not to be positive when this makes no sense.ArgumentOutOfRangeException
for the case where minimumDifficulty
would equal difficultyStability
.minimumDifficulty
to be zero, which would allow difficulty to be stuck at zero indefinitely, when this does not make sense.