Blockchain in C#/.NET for on-chain, decentralized gaming
LGPL-2.1 License
Bot releases are visible (Hide)
Published by github-actions[bot] about 3 years ago
Released on September 14, 2021.
BlockChain<T>.MineBlock()
had created a block that includes both transactions when there are two or more transactions with the same nonce on the stage. [#1491]
Published by github-actions[bot] about 3 years ago
Released on September 10, 2021.
Swarm<T>
fails to reply transaction when any of the requested transactions id in GetTxs
message does not exist in the storage. [#1481]
Published by github-actions[bot] about 3 years ago
Released on August 28, 2021.
NetMQTransport
became to process message in non blocking way. [#1451]
Published by github-actions[bot] about 3 years ago
Released on August 25, 2021.
Swarm<T>.BlockDemand
property. [#1419, #1425]
BlockChain<T>.Tip
property is now non-nullable. [#1430]
BlockDemandTable<T>
class. [#1419, #1425]
Swarm<T>.BlockDemandTable
property. [#1419, #1425]
SwarmOptions.PollInterval
property. [#1419, #1425]
SwarmOptions.MaximumPollPeers
property. [#1419, #1425]
Swarm<T>.PreloadAsync()
failed to sync blocks from the peer that has chain with higher difficulty, but lower index. [#1419, #1425]
Published by github-actions[bot] about 3 years ago
Published by github-actions[bot] about 3 years ago
Released on Aug 18, 2021.
Published by github-actions[bot] about 3 years ago
Published by github-actions[bot] about 3 years ago
Published by github-actions[bot] about 3 years ago
Released on July 29, 2021.
HashAlgorithmType.Digest()
method's bug that it returns an incorrect digest bytes when it is called by multiple threads at a time. [#1411]
Published by github-actions[bot] about 3 years ago
Released on July 28, 2021.
bool render = false
option to Swarm<T>.PreloadAsync()
. Blocks and actions in preloaded blocks will be rendered if the switch is set to true
. [#1391]
Transaction<T>.CreateUnsigned()
method. [#1378]
SwarmOptions.TableSize
property. [#1401]
SwarmOptions.BucketSize
property. [#1401]
Transaction<T>.Validate()
became to throw InvalidTxSignatureException
if the transaction was not signed. [#1378]
Swarm<T>
had stopped when ObjectDisposedException
is thrown during NetMQTransport.DoBroadcast()
. [#1362, #1365]
Published by github-actions[bot] about 3 years ago
Released on July 28, 2021.
Swarm<T>.PreloadAsync()
now checks the existence of blocks in the storage (was in the blockchain). [#1324]
Published by github-actions[bot] about 3 years ago
Released on July 23th, 2021.
BlockHash
, which was introduced in this release, which has been done as HashDigest<SHA256>
. [#1192, #1197]
Block<T>.Hash
property became BlockHash
(was HashDigest<SHA256>
).Block<T>.PreviousHash
property became BlockHash?
(was HashDigest<SHA256>?
).Block<T>()
constructors' hash
parameter became BlockHash
(were HashDigest<SHA256>
).Block<T>()
constructors' previousHash
parameter became BlockHash?
(were HashDigest<SHA256>?
).Block<T>.Mine()
method's previousHash
parameter became BlockHash?
(was HashDigest<SHA256>?
).HashCash.Hash()
method became BlockHash
(was HashDigest<SHA256>
).Transaction<T>()
constructor's genesisHash
parameter became BlockHash?
(was HashDigest<SHA256>?
).Transaction<T>.Create()
method's genesisHash
parameter became BlockHash?
(was HashDigest<SHA256>?
).Transaction<T>.GenesisHash
property became BlockHash?
(was HashDigest<SHA256>?
).Transaction<T>.EvaluateActionsGradually()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).Transaction<T>.EvaluateActions()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).BlockChain[]
indexer's parameter became BlockHash
(was HashDigest<SHA256>
).BlockChain.BlockHashes
property became IEnumerable<BlockHash>
(was IEnumerable<HashDigest<SHA256>>
).BlockChain.ContainsBlock()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).BlockChain.GetState()
method's offset
parameter became BlockHash?
(was HashDigest<SHA256>?
).BlockChain.GetBalance()
method's offset
parameter became BlockHash?
(was HashDigest<SHA256>?
).StateCompleter<T>
delegate's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).FungibleAssetStateCompleter<T>
delegate's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).BlockSet<T>
no more implements IDictionary<HashDigest<SHA256>, Block<T>>
, but now implements IDictionary<BlockHash, Block<T>>
.ActionExecutionState.ExecutedBlockHash
property became BlockHash
(was HashDigest<SHA256>
).BlockDownloadState.ReceivedBlockHash
property became BlockHash
(was HashDigest<SHA256>
).BlockVerificationState.VerifiedBlockHash
property became BlockHash
(was HashDigest<SHA256>
).IncompleteBlockStatesException()
constructor's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).IncompleteBlockStatesException.BlockHash
property became BlockHash
(was HashDigest<SHA256>
).InvalidGenesisBlockException()
constructor's networkExpected
and stored
parameters became BlockHash
(were HashDigest<SHA256>
).InvalidGenesisBlockException.NetworkExpected
property became BlockHash
(was HashDigest<SHA256>
).InvalidGenesisBlockException.Stored
property became BlockHash
(was HashDigest<SHA256>
).InvalidTxGenesisHashException()
constructor's expectedGenesisHash
parameter became BlockHash
(was HashDigest<SHA256>
).InvalidTxGenesisHashException()
constructor's improperGenesisHash
parameter became BlockHash?
(was HashDigest<SHA256>?
).InvalidTxGenesisHashException.ExpectedGenesisHash
property became BlockHash
(was HashDigest<SHA256>
).InvalidTxGenesisHashException.ImproperGenesisHash
property became BlockHash?
(was HashDigest<SHA256>?
).IStore.IndexBlockHash()
method became BlockHash?
(was HashDigest<SHA256>?
).IStore.AppendIndex()
method's hash
parameter became BlockHash
(was HashDigest<SHA256>
).IStore.ForkBlockIndexes()
method's HashDigest<SHA256> branchPoint
parameter with BlockHash branchpoint
.IStore.IterateIndexes()
method became IEnumerable<BlockHash>
(was IEnumerable<HashDigest<SHA256>>
).IStore.IterateBlockHashes()
method became IEnumerable<BlockHash>
(was IEnumerable<HashDigest<SHA256>>
).IStore.GetBlock<T>()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).IStore.GetBlockIndex()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).IStore.GetBlockDigest()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).IStore.DeleteBlock()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).IStore.ContainsBlock()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).IStateStore.GetState()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).IStateStore.ContainsBlockStates()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).TrieStateStore.GetRootHash()
method's blockHash
parameter became BlockHash
(was HashDigest<SHA256>
).TrieStateStore.PruneStates()
method's excludeBlockHashes
parameter became IImmutableSet<BlockHash>
(was ImmutableHashSet<HashDigest<SHA256>>
).IBlockPolicy<T>.GetHashAlgorithm()
method.HashAlgorithmType? hashAlgorithm
parameter to Block<T>(long, long, BigInteger, Nonce, Address?, BlockHash?, DateTimeOffset, IReadOnlyList<Transaction<T>>, ImmutableArray<byte>?, HashDigest<SHA256>?, int protocolVersion)
constructor.HashAlgorithmType hashAlgorithm
parameter to Block<T>.MineBlock()
method.Block<T>.PreEvaluationHash
property became ImmutableArray<byte>?
(was HashDigest<SHA256>?
). [#1192, #1197]
Block<T>()
constructors' preEvaluationHash
parameter became ImmutableArray<byte>?
(were HashDigest<SHA256>?
). [#1192, #1197]
InvalidBlockPreEvaluationHashException.ActualPreEvaluationHash
and ExpectedPreEvaluationHash
properties became ImmutableArray<byte>
(were HashDigest<SHA256>
). [#1192, #1197]
InvalidBlockPreEvaluationHashException()
constructor's actualPreEvaluationHash
and and expectedPreEvaluationHash
parameters became ImmutableArray<byte>
(were HashDigest<SHA256>
). [#1192, #1197]
UnexpectedlyTerminatedActionException()
constructor's HashDigest<SHA256>? blockHash
parameter with ImmutableArray<byte>? preEvaluationHash
. [#1192, #1197]
UnexpectedlyTerminatedActionException.BlockHash
property with PreEvaluationHash.
[#1192, #1197]
Hashcash.Answer(Stamp, long, CancellationToken)
method with Hashcash.Answer<T>(Stamp, HashAlgorithm, long, CancellationToken)
method.Hashcash.Hash()
method.HashDigest<T>.Satisfies()
method. This was replaced by ByteUtil.Satisfies()
method instead. [#1192, #1197]
hashAlgorithmGetter
parameter to BlockSet<T>()
constructor.hashAlgorithm
parameter to BlockChain<T>.MakeGenesisBlock()
method.hashAlgorithmGetter
parameter to BlockPolicy<T>()
constructor.IActionContext.TxId
property. [#1275]
IStore.PutTxExecution(TxSuccess)
method. [#1156, #1289]
IStore.PutTxExecution(TxFailure)
method. [#1156, #1289]
IStore.GetTxExecution()
method. [#1156, #1289]
Guid? chainId = null
from IStateStore.GetState()
method. [#1289]
compress
parameter from DefaultStore()
constructor. [#1289]
statesCacheSize
parameter from DefaultStore()
constructor. [#1289]
StunMessage.Parse(Stream)
method. [#1228]
ITransport
and NetMQTransport
from Libplanet.Net
to Libplanet.Net.Transports
. [#1235]
Block<T>
now enforces a collection of Transaction<T>
s to be less mutable. [#1274]
Block<T>()
constructor's transactions
parameter became IReadOnlyList<T>
(was IEnumerable<T>
).Transactions
property of Block<T>
became IReadOnlyList<T>
(was IEnumerable<T>
).IReadOnlyList<T>
(was IEnumerable<T>
). [#1230, #1271]
RoutingTable.Peers
RoutingTable.PeerStates
Swarm<T>.Peers
Swarm<T>.PeerStates
RoutingTable.Neighbors()
became IReadOnlyList<BoundPeer>
(was IEnumerable<BoundPeer>
). [#1230, #1271]
IAction
s are moved to a new ActionEvaluator
class. [#1301, #1305]
Block<T>.Evaluate()
method. Use ActionEvaluator.Evaluate()
method instead.Block<T>.EvaluateActionsPerTx()
method.Transaction<T>.EvaluateActionsGradually()
method.Transaction<T>.EvaluateActions()
method.action
, inputContext
, and outputStates
for ActionEvaluation()
constructor can no longer be null
. [#1305]
IStore.PutTxIdBlockHashIndex(TxId, BlockHash)
method. [#1294, #1328]
IStore.GetFirstTxIdBlockHashIndex(TxId)
method. [#1294, #1328]
IStore.DeleteTxIdBlockHashIndex(TxId, BlockHash)
method. [#1294, #1328]
IStore.IterateTxIdBlockHashIndex(TxId)
method. [#1294, #1328]
miner
for Block<T>()
and Block<T>.Mine()
can no longer be null
. [#1341]
Swarm<T>.StartAsync()
method became to receive broadcastBlockInterval
(or millisecondsBroadcastBlockInterval
) parameter. [#1351]
minimumBroadcastTarget
to NetMQTransport()
constructor. [#1379]
InvalidTxUpdatedAddressesException
. [#368, #1389]
ActionEvaluator
class. [#1301, #1305]
BlockHash
struct. [#1192, #1197]
HashDigest<T>.DeriveFrom()
method. [#1197]
HashAlgorithmType
class. [#1314, #1352]
HashAlgorithmGetter
delegate. [#1314, #1352]
HashAlgorithmTable
static class. [#1314, #1352]
BlockChain<T>.GetTxExecution()
method. [#1156, #1289]
StunMessage.ParseAsync(Stream, CancellationToken)
method. [#1228]
Swarm<T>.AddPeersAsync()
method. [#1234]
NetMQTransport.QueryAppProtocolVersion()
static method. [#1235]
BoundPeer.Parse()
static method. [#1240]
TransportException
class. [#1242]
SwarmOptions.StaticPeers
property. [#1230, #1271]
SwarmOptions.StaticPeersMaintainPeriod
property. [#1230, #1367]
SwarmOptions.BranchpointThreshold
property. [#1348]
AtomicActionRenderer<T>
class. [#1267, #1275]
TxExecution
abstract class. [#1156, #1289]
TxSuccess
class. [#1156, #1289]
TxFailure
class. [#1156, #1289]
IExtractableException
interface. [#1156, #1289]
ExtractableException
static class. [#1156, #1289]
Address(Binary)
overloaded constructor. [#1289]
Currency(IValue)
overloaded constructor. [#1289]
Currency.Serialize()
method. [#1289]
ByteUtil.TimingSafelyCompare()
method. [#1314, #1352]
ByteUtil.Satisfies()
method. [#1314, #1352]
BlockChain<T>.ExecuteActions()
method. [#1368]
SwarmOptions.MinimumBroadcastTarget
property. [#1379]
BlockChain<T>.Append()
now records a TxExecution
for every single transaction in the appended Block<T>
, whether a transaction is successful (TxSuccess
is recorded for this case) or not (TxFailure
is recorded for this case). [#1156, #1289]
ITransport.StartAsync()
and ITransport.RunAsync()
became to throw TransportException
instead of SwarmException
. [#1242]
NetMQTransport
became to enforce NetMQ/AsyncIO to use its pure .NET implementation instead of Windows' IOCP when it is running on Mono, which powers Unity engine, since Unity does not properly implement the IOCP even on Windows. It had been done by Swarm<T>
, but as the ITransport
is now separated from it, this became done by NetMQTransport
instead of Swarm<T>
. [#247, #1278]
RocksDBStore.ForkBlockIndexes()
became to share common ancestors between forks rather than duplicating them so that much less space is used. [#1280, #1287]
BlockChain<T>.Append()
cumulates indexes for pairs (TxId and BlockHash). A transaction inclusion for a block is retrievable by using this index. [#1315, #1329]
Block<T>.Transactions
will be ordered using a different scheme once the protocol version is bumped to 2
. [#1322, #1323, #1326]
ActionEvaluator<T>.EvaluateActions()
now throws an unmanaged exception if OutOfMemoryException
is caught from IAction.Execute()
. [#1320, #1343]
Swarm<T>
. [#1334]
Swarm<T>
now maintains static peers provided via SwarmOptions.StaticPeers
periodically. [#1230, #1367]
Block<T>.Header
is now cached instead of creating a new instance every call. [#1347]
BlockChain<T>.ExecuteActions()
became no longer throw InvalidTxUpdatedAddressesException
. [#368, #1389]
Transaction<T>.Actions
had not been atomic. Actions
in a Transaction<T>
now became executed all or nothing at all. [#1267, #1275]
Transaction<T>.EvaluateActions()
method became atomic.Transaction<T>.EvaluateActionsGradually()
method had returned the same number of ActionEvaluation
s to Transaction<T>.Actions
, but now became to omit the evaluations after the first action throwing an exception. If no action throws any exception, it still returns the same number of ActionEvaluation
s to Transaction<T>.Actions
.Transaction<T>
s having any exception-throwing action now do not commit any changes at all to IStateStore
.IActionRenderer<T>
(RenderAction()
, RenderActionError()
, UnrenderAction()
, and UnrenderActionError()
) became not invoked. If you want to dismiss all actions in unsuccessful transactions at all, wrap your action renderer with AtomicActionRenderer<T>
.KademliaProtocol.BootstrapAsync()
has sent multiple Ping
messages to other peers. [#1219]
KademliaProtocol.CheckReplacementCacheAsync()
has updated cached peers multiple times. [#1219]
CancellationTokenRegistration
s. [#1228]
DefaultStore.Dispose()
and TrieStateStore.Dispose()
had not been idempotent. [#1272]
RocksDBStore.Dispose()
, MonoRocksDBStore.Dispose()
, and RocksDBKeyValueStore.Dispose()
had not been idempotent. [#1272, #1289]
NetMQTransport
had hung forever within Mono runtime. [#1278]
DefaultStore.ForkBlockIndexes()
hadn't copied genesis block. [#1325]
RocksDBStore.GetBlock<T>()
and RocksDBStore.GetTransaction<T>()
handn't returned expected values in multithreading environment. [#1339, #1342]
Swarm<T>
hadn't respond immediately under load. [#1360]
--json
to planet apv analyze
command to print result as JSON format. [#1240]
planet apv query
subcommand to query app protocol version of specific peer. [#1240]
--no-passphrase
to planet key remove
command to remove key without asking passphrase. [#1213, #1265]
planet key derive
subcommand to derive the address or public key from a private. [#1268]
planet store [block-by-hash|block-by-index|tx-by-id]
commands to retrieve the data from the store. [#1284, #1285, #1298]
planet store block-by-tx-id
commands to retrieve the data from the store. [#1316, #1340]
planet store build-index-tx-block
commands to build index from TxId to BlockHash. [#1316, #1340]
planet stats summary
command to retrieve a state summary of a stored chain in a CSV format. [#1353]
Published by github-actions[bot] over 3 years ago
Released on April 22th, 2021.
Published by github-actions[bot] over 3 years ago
Released on March 30, 2021.
protocolVersion
to Block<T>(long, long, BigInteger, Nonce, Address?, HashDigest<SHA256>?, DateTimeOffset, IEnumerable<Transaction<T>> transactions, HashDigest<SHA256>?, HashDigest<SHA256>?)
constructor. [#1142, #1147, #1162]
protocolVersion
to Block<T>.Mine()
method. [#1142, #1147, #1162]
protocolVersion
to BlockHeader()
constructor. [#1142, #1147, #1162]
stagePolicy
as the second parameter to BlockChain<T>()
constructor. [#1130, #1131]
IBlockPolicy<T>.CanonicalChainComparer
property to make the canonical chain. [#1155, #1165, #1184]
canonicalChainComparer
as the last parameter to BlockPolicy()
constructors. [#1155, #1165, #1184]
canonicalChainComparer
as the second parameter to DelayedRenderer()
constructor. [#1155, #1165, #1184]
canonicalChainComparer
as the second parameter to DelayedActionRenderer()
constructor. [#1155, #1165, #1184]
reorgResistantHeight
parameter into DelayedActionRenderer<T>()
constructor. [#1163]
IStore.SetBlockPerceivedTime()
method. [#1184]
IStore.GetBlockPerceivedTime()
method. [#1184]
TransactionSet<T>
class. [#1165]
IBlockStatesStore
interface. [#1117]
BaseBlockStatesStore
abstract class. [#1117]
Swarm<T>.GetTrustedStateCompleterAsync()
method. [#1117]
trustedStateValidators
parameter from Swarm<T>.PreloadAsync()
method. [#1117]
Swarm<T>.TraceTable()
method. [#1120]
IActionContext.BlockAction
property. [#1143]
TimeSpan
-typed messageLifespan
parameter into NetMQTransport()
constructor. [#1171]
IStore.ForkTxNonces()
method. [#1198]
PeerState.Address
Property. [#1215]
IProtocol.RebuildConnectionAsync(CancellationToken)
method was replaced by, IProtocol.RebuildConnectionAsync(int, CancellationToken)
method. [#1215]
Swarm<T>
became no longer retry when Swarm<T>
receives less than 500 blocks. [#1112]
ChainStatus
message type (with the type number 0x24
) was replaced by a new ChainStatus
message type (with the type number 0x25
). [#1155, #1165]
IBlockStatesStore
interface. [#1117]
GetRecentStates
message type (with the type number 0x0b
)RecentStates
message type (with the type number 0x13
)GetBlockStates
message type (with the type number 0x22
)BlockStates
message type (with the type number 0x23
)Swarm<T>
became to ignore messages made earlier than a certain amount of time, which is configured by SwarmOptions.MessageLifespan
. [#1160, #1171]
RocksDBStore()
constructor's txEpochUnitSeconds
and blockEpochUnitSeconds
parameters (86400 by default). [#1183, #1194]
RocksDBStore()
is manage database connection by LRU Cache. The max size of connection cache is configured by RocksDBStore()
constructor's dbConnectionCacheSize
parameters (100 by default). [#1183, #1194]
RocksDBStore
that was previously used has been separated into a class called MonoRocksDBStore
. Please use this class if you need to migrate. [#1183, #1204]
Block<T>.CurrentProtocolVersion
constant. [#1142, #1147]
Block<T>.ProtocolVersion
property. [#1142, #1147]
Block<T>.Header
property. [#1070, #1102]
BlockHeader.ProtocolVersion
property. [#1142, #1147]
IBlockExcerpt
interface. [#1155, #1165, #1170]
BlockExcerpt
static class. [#1155, #1165, #1170, #1184]
Block<T>
became to implement IBlockExceprt
interface. [#1155, #1165, #1170]
BlockHeader
became to implement IBlockExceprt
interface. [#1155, #1165, #1170]
BlockPerception
struct. [#1155, #1184]
BlockChain<T>.PerceiveBlock()
method. [#1155, #1184]
DelayedRenderer<T>.CanonicalChainComparer
and DelayedActionRenderer<T>.CanonicalChainComparer
properties. [#1155, #1165, #1184]
TotalDifficultyComparer
class. [#1155, #1165, #1170, #1184]
IStagePolicy<T>
interface. [#1130, #1131, #1186]
VolatileStagePolicy<T>
class. [#1130, #1131, #1136, #1186]
ITransport
interface. [#1052]
NetMQTransport
class which implements ITransport
. [#1052]
Message
abstract class. [#1052]
BlockExceedingTransactionsException
class. [#1104, #1110]
BlockChain<T>.GetStagedTransactionIds()
method. [#1089]
maxTotalWalSize
, keepLogFileNum
and maxLogFileSize
parameters into RocksDBStore()
constructor. [#1065, #1102, #1132]
Swarm<T>.BlockDemand
property. [#1068, #1102]
BlockDemand
struct. [#1068, #1102]
TurnClient.PublicAddress
property. [#1074, #1102]
TurnClient.EndPoint
property. [#1074, #1102]
TurnClient.BehindNAT
property. [#1074, #1102]
TurnClient.InitializeTurnAsync(int, CancellationToken)
method. [#1074, #1102]
TurnClient.StartAsync(int, CancellationToken)
method. [#1074, #1102]
TurnClient.ReconnectTurn(int, CancellationToken)
method. [#1074, #1102]
TurnClient.IsConnectable(CancellationToken)
method. [#1074, #1102]
TurnClient.ReconnectTurn(CancellationToken)
method. [#1074, #1102]
Libplanet.Blockchain.Renderers.Debug.RenderRecord<T>
abstract class and its subclasses: [#1119]
RenderRecord<T>.ActionBase
abstract classRenderRecord<T>.ActionSuccess
classRenderRecord<T>.ActionError
classRenderRecord<T>.BlockBase
abstract classRenderRecord<T>.Block
classRenderRecord<T>.Reorg
classLibplanet.Blockchain.Renderers.Debug.RecordingActionRenderer<T>
class. [#1119]
Libplanet.Blockchain.Renderers.Debug.ValidatingActionRenderer<T>
class. [#1119]
Libplanet.Blockchain.Renderers.Debug.InvalidRenderException<T>
class. [#1119]
InvalidBlockProtocolVersionException
class. [#1142, #1147]
InvalidBlockTxHashException
class. [#1116]
Swarm<T>.PeerStates
property. [#1120]
IProtocol
interface. [#1120]
KademliaProtocol
class which implements IProtocol
. [#1120, #1135]
reorgResistantHeight
parameters into DelayedActionRenderer<T>()
constructor. [#1163]
InvalidBlockPreEvaluationHashException
class. [#1148]
validate
which is true
by default, to Transaction<T>.Deserialize()
. [#1149]
SwarmOptions.MessageLifespan
property. [#1171]
InvalidTimestampException
class. [#1171]
PeerState.Peer
Property. [#1215]
SwarmOptions.RefreshPeriod
property, which is 10 seconds by default. [#1215]
SwarmOptions.RefreshLifespan
property, which is 60 seconds by default. [#1215]
BlockHeader.ProtocolVersion
was added, the existing blocks are considered protocol compliant with the protocol version zero. [#1142, #1147, #1162]
BlockChain<T>
follows VolatileStagePolicy<T>
, which is Libplanet's the only built-in IStagePolicy<T>
implementation at the moment, as its StagePolicy
, its staged transactions are no longer persistent but volatile instead. It also automatically purges staged transactions after the given Lifetime
, which is 3 hours by default. [#1130, #1131, #1136, #1186]
Swarm<T>
became not to receive states from trusted peers. [#1061, #1102]
Swarm<T>
became not to retry when block downloading. [#1062, #1102]
BlockChain<T>.MineBlock()
. [#1116, #1124]
Block<T>.Deserialize()
. [#1116]
Swarm<T>
became not to fill states from trusted peers, because now states can be validated rather than trusted due to MPT. [#1117]
HashDigest<SHA256>
became serializable. [#795, #1125]
Transaction<T>()
constructors became not to validate itself. [#1149]
BlockChain<T>.Append()
became to validate the given Block<T>
before storing its StateRootHash
. [#1172]
Blockchain<T>
became not to stage transactions having nonce less than or equal to the nonce of the same signer's latest transaction in already mined blocks. [#1173, #1180, #1186]
Message.Parse()
. [#1161, #1181]
BlockChain<T>.Fork()
. [#1198]
Swarm<T>
became not to call KademliaProtocol.RebuildConnectionAsync()
right after Swarm<T>.StartAsync()
. If you called Swarm<T>.BootstrapAsync()
before Swarm<T>.StartAsync()
, peers in your table may not have you in their table right after Swarm<T>.StartAsync()
(which was almost guaranteed before). [#1208]
Swarm<T>.BootstrapAsync()
before Swarm<T>.StartAsync()
are now marked as stale so that Swarm<T>.RefreshTableAsync()
will update. [#1215]
TrieStateStore
classTurnClient
classActionEvaluation
classBlockChain<T>.MineBlock()
was not automatically cancelled when the tip of the chain was changed occasionally. [#1141]
PreEvaluationHash
was considered as a valid block. [#1148, #1202]
IAccountStateDelta.TransferAsset()
's internal implementation that it had doubled recipient's balance when a sender and a recipient is the same. *Since this changes the protocol, for backward compatibility, the actions belonging to the existing block, which was mined before the protocol v1, are guaranteed to still behave as it had done. [#1152]
Block<T>.Evaluate()
hadn't validate its hash. [#1168]
CancellationTokenSource
s. [#1182, #1212]
TurnClient
hadn't released its relay connections after reconnecting. [#1185]
planet mpt diff
command became to take 4 arguments (which was 3) so that it can compare state root hashes from two different KV stores. The existing commands like planet mpt diff STORE A B
do not work anymore, and these should be instead like planet mpt diff STORE A STORE B
. [#1129]
planet mpt
became to disallow names looking like URIs to disambiguate aliases from the literal store URIs. [#1129]
planet mpt list
and planet mpt query
. [#1137]
Published by github-actions[bot] over 3 years ago
Published by github-actions[bot] almost 4 years ago
Released on November 25, 2020.
BlockChain<T>.Append()
method's bug that it had accepted a Block<T>
having more Transactions
than the number specified by the IBlockPolicy<T>.MaxTransactionsPerBlock
property. Now it throws InvalidBlockException
instead for such case. [#1104]
Published by github-actions[bot] almost 4 years ago
Released on November 24, 2020.
Transaction<T>.Id
property became lazy-loaded and cached if it's once loaded. (It had been loaded when the object is instantiated.) [#1079, #1080]
Transaction<T>.Serialize()
became cached under the hood. [[#1079, #1080]]
BlockChain<T>.MineBlock()
method's bug which excludes one's all transactions virtually forever after a signer's transactions once have been staged without the ascending order of nonce (usually due to their inconsistent propagation latency on the network). [#1057, #1059]
BlockChain<T>.MineBlock()
method became to cut off staged transactions to mine if it takes longer than 4 seconds to collect and validate them. Those rest staged transactions are postponed until next block mining. [#1057, #1059]
BlockChain<T>.ContainsBlock()
method was optimized so that it does not needlessly load an entire block, but looks up only an index instead. [#1057, #1059]
BlockChain<T>
became not to validate genesis block during fork, where the state store is not an implementation of IBlockStatesStore
. [#1063]
Swarm<T>.GetPeerChainStateAsync()
has thrown NullReferenceException
when peers in table does failed to respond. [#1066]
BlockChain<T>
had not locked readers–writer lock for state changes during MineBlock()
. [#1077, #1087]
PolymorphicAction<T>.ToString()
became more human-readable. [#1085, #1087]
MerkleTrie
had had MrrkleTrie.EmptyRootHash
as root node, which had been unable to insert new nodes. [#1087, #1091]
Published by github-actions[bot] almost 4 years ago
Released on October 27, 2020.
IAction
to IRenderer<T>
, which is introduced in this version. From now on, rendering logic needs to be injected from outside through BlockChain<T>.Renderers
, rather than IAction
s knowing how to render themselves. IRenderer<T>
also unified BlockChain<T>.TipChanged
event, and introduced new events like IActionRenderer<T>.RenderActionError()
, IActionRenderer<T>.RenderBlockEnd()
, IRenderer<T>.RenderReorg()
, and IRenderer<T>.RenderReorgEnd()
. [#860, #875, #959, #963]
IAction.Render()
method, which was replaced by IActionRenderer<T>.RenderAction()
.IAction.Unrender()
method, which was replaced by IActionRenderer<T>.UnrenderAction()
.BlockChain<T>.TipChanged
event, which was replaced by IRenderer<T>.RenderBlock()
.PolymorphicAction<T>.Render()
and Unrender()
methods.BlockChain<T>.TipChangedEventArgs
class.IAccountStateDelta
: [#861, #900, #954]
UpdatedFungibleAssetsAccounts
propertyMintAsset(Address, Currency, BigInteger)
methodTransferAsset(Address, Address, Currency, BigInteger)
methodBurnAsset(Address, Currency, BigInteger)
methodGetBalance(Address, Currency)
methodIAccountStateDelta.StateUpdatedAddresses
property in order to distinguish state updates from asset states. [#861, #900]
AccountBalanceGetter accountBalanceGetter
to Block<T>.EvaluateActionsPerTx()
method. [#861, #900]
BlockChain<T>.StageTransaction()
became to throw InvalidTxGenesisHashException
when it takes a Transaction<T>
from a heterogeneous BlockChain<T>
with a different genesis block. [#796, #878]
renderers
optional parameter to BlockChain<T>()
constructor. [#883, #959, #963]
BigInteger
-typed totalDifficulty
parameter to Block<T>()
constructor. [#666, #917]
BigInteger
-typed previousTotalDifficulty
parameter to Block<T>.Mine()
static method. [#666, #917]
options
optional parameter to Swarm<T>()
constructor. [#926]
ICryptoBackend
became to ICryptoBackend<T>
. [#932]
ICryptoBackend.Verify(HashDigest<SHA256>, byte[], PublicKey)
became to ICryptoBackend<T>.Verify(HashDigest<T>, byte[], PublicKey)
[#932]
ICryptoBackend<T>.Sign(HashDigest<T>, PrivateKey)
method. [#932]
DefaultCryptoBackend
became to DefaultCryptoBackend<T>
. [#932]
ImmutableArray<byte>
-typed preEvaluationHash
parameter to BlockHeader
constructor. [#931, #935]
HashDigest<SHA256>
-typed preEvaluationHash
parameter to Block<T>()
constructor. [#931, #935]
SerializationInfoExtensions.GetValueOrDefault<T>()
to SerializationInfoExtensions.TryGetValue<T>()
. [#940]
bool append = true
option to both BlockChain<T>.MineBlock()
overloaded methods. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option is turned on by default. [#946]
int? maxTransactions
option to both BlockChain<T>.MineBlock()
overloaded methods. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option is turned on by default. [#1037, #1039, #1050]
StateCompleterSet<T>? stateCompleters
option to two BlockChain<T>.Append()
overloaded methods. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option has the default value (StateCompleterSet<T>.Recalculate
). [#946]
CancellationToken cancellationToken = default(CancellationToken)
option to BlockChain<T>.MineBlock(Address miner)
overloaded method. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option has the default value. [#946]
IImmutableSet<Address> trustedStateValidators = null
option to both Swarm<T>.StartAsync()
overloaded methods. Although this breaks ABI-level backward compatibility (i.e., you need to rebuild your assemblies), still is backward-compatible at API-level as the option is turned on by default. [#946]
Peer.AppProtocolVersion
property. [#949]
Peer.IsCompatibleWith()
method. [#949]
Peer(PublicKey, AppProtocolVersion)
constructor with Peer(PublicKey)
constructor. [#949]
BoundPeer(PublicKey, DnsEndPoint, AppProtocolVersion)
constructor with Peer(PublicKey, DnsEndPoint)
constructor. [#949]
IStore
's some methods dedicated to block states into IBlockStatesStore
. [#950]
ListStateKeys()
method.ListAllStateReferences()
method.LookupStateReference()
method.IterateStateReferences()
method.StoreStateReference()
method.ForkStateReferences()
method.GetBlockStates()
method.SetBlockStates()
method.PruneBlockStates()
method.IStore.LookupStateReference<T>(Guid, string, Block<T>)
method was changed to LookupStateReference(Guid, string, long)
. [#950]
IStateStore
-typed stateStore
to BlockChain<T>
constructor. [#950]
Swarm<T>.FindSpecificPeerAsync(Address, Address, int, BoundPeer, TimeSpan?, CancellationToken)
method with Swarm<T>.FindSpecificPeerAsync(Address, int, TimeSpan?, CancellationToken)
. [#981]
IActionContext.GetUnconsumedContext()
method. [#980]
ImmutableArray<byte>
-typed stateRootHash
parameter to BlockHeader
constructor. [#986]
HashDigest<SHA256>
-typed stateRootHash
parameter to Block<T>()
constructor. [#986]
IBlockPolicy<T>.MaxTransactionsPerBlock
property. [#1037, #1050]
IBlockPolicy<T>.GetMaxBlockBytes()
method. [#201, #1050]
IBlockPolicy<T>.DoesTransactionFollowPolicy()
method became to take additional BlockChain<T>
parameter as its context. [#1012]
BlockPolicy<T>
class became virtual
. [#1010]
int maxTransactionsPerBlock
option to both BlockPolicy<T>()
overloaded constructors. [#1037, #1050]
int maxBlockBytes
and int maxGenesisBytes
options to both BlockPolicy<T>()
overloaded constructors. [#201, #1050]
BlockPolicy<T>()
constructor's doesTransactionFollowPolicy
parameter became Func<Transaction<T>, BlockChain<T>, bool>
on . [#1012]
cacheSize
optional parameter to BlockSet<T>()
constructor. [#1013]
Address(SerializationInfo, StreamingContext)
constructor. [#1022]
InvalidMessageException
class. [#1021]
RecentStates.StateReferences
became to IImmutableDictionary<string, IImmutableList<HashDigest<SHA256>>>
from IImmutableDictionary<Address, IImmutableList<HashDigest<SHA256>>>
. [#912]
RecentStates
message type (with the type number 0x0f
) was replaced by a new RecentStates
message type (with the type number 0x13
). [#912]
BlockHeader.TotalDifficulty
property. [#666, #917]
Pong
message type (with the type number 0x02
) was replaced by a new Pong
message type (with the type number 0x14
). [#459, #919, #920, #930]
TimestampThreshold
between Block<T>
s was changed from 15 minutes to 15 seconds. [#922, #925]
Swarm<T>
became to have 5 more message types:
BlockHeaderMessage
message type (with the type number 0x0d
) was replaced by a new BlockHeaderMessage
message type (with the type number 0x0c
). [#1003, #1004]
PreloadBlockDownloadFailEventArgs
class. [#1002]
blockDownloadFailed
parameter from Swarm<T>.PreloadAsync()
method. Use SwarmOptions.BlockDownloadTimeout
instead. [#1002]
RawTransaction<T>.GenesisHash
property. [#796, #878]
BlockHeader.TotalDifficulty
property. [#666, #917]
Currency
struct. [#861, #900, #954]
FungibleAssetValue
struct. [#861, #944, #954]
AccountBalanceGetter
delegate. [#861, #900, #954]
TurnClient.BindProxies()
method. [#756, #868]
ActionEvaluation.Exception
property. [#860, [#875]]
InvalidTxGenesisHashException
class. [#796, #878]
InvalidBlockBytesLengthException
class. [#201, #1050]
CurrencyPermissionException
class. [#861, #900]
InsufficientBalanceException
class. [#861, #900, #954]
BlockChain<T>.GetBalance()
method. [#861, #900]
Block<T>.TotalDifficulty
property. [#666, #917]
Block<T>.BytesLength
property. [#201, #1050]
SwarmOptions
class. [#926]
PeerChainState
struct. [#936]
Swarm<T>.GetPeerChainStateAsync()
method. [#936]
Swarm<T>.LastMessageTimestamp
property. [#964]
Block<T>.PreEvaluationHash
property. [#931, #935]
BlockHeader.PreEvaluationHash
property. [#931, #935]
Transaction<T>.BytesLength
property. [#201, #1050]
HashDigest(ImmutableArray<byte>)
constructor. [#931, #935]
BlockChain<T>.GetState(Address, HashDigest<SHA256>?, bool)
method with GetState(Address, HashDigest<SHA256>?, StateCompleter<T>)
method. Specifying completeStates: true
and false
can be replaced by stateCompleter: StateCompleters<T>.Recalculate
and StateCompleters<T>.Reject
, respectively.BlockChain<T>.GetBalance(Address, Currency, HashDigest<SHA256>?, bool)
method with GetState(Address, Currency, HashDigest<SHA256>?, StateCompleter<T>)
method. Specifying completeStates: true
and false
can be replaced by stateCompleter: FungibleAssetStateCompleters<T>.Recalculate
and FungibleAssetStateCompleters<T>.Reject
, respectively.StateCompleter<T>
delegate.FungibleAssetStateCompleter<T>
delegate.StateCompleterSet<T>
struct.StateCompleters<T>
static class.FungibleAssetStateCompleters<T>
static class.Swarm<T>.GetTrustedStateCompleterAsync()
method.IRenderer<T>
interface. [#959, #963]
IActionRenderer<T>
interface. [#959, #967, #970]
AnonymousRenderer<T>
class. [#959, #963]
AnonymousActionRenderer<T>
interface. [#959, #967, #970]
DelayedRenderer<T>
class. [#980, #1029]
DelayedActionRenderer<T>
class. [#980, #1029]
LoggedRenderer<T>
class. [#959, #963]
LoggedActionRenderer<T>
interface. [#959, #967, #970]
BlockChain<T>.Renderers
property. [#945, #959, #963]
BlockChain<T>.ActionRenderers
property. [#959, #967, #970]
Swarm<T>.AppProtocolVersion
property. [#949]
DefaultStore
became to implement IBlockStatesStore
. [#950]
IStateStore
interface. [#950]
IBlockStatesStore
interface. [#950]
TrieStateStore
class. [#939]
ITrie
interface. [#939, #1023]
MerkleTrie
class. [#939, #1023]
IKeyValueStore
interface. [#939]
DefaultKeyValueStore
class. [#939]
CacheableKeyValueStore
class. [#939]
RocksDBStore
became to implement IBlockStatesStore
. [#950]
RocksDBKeyValueStore
. [#939]
InvalidBlockStateRootHashException
class. [#986]
Block<T>.StateRootHash
property. [#986]
BlockHeader.StateRootHash
property. [#986]
MerkleTrieExtensions
static class. [#1023]
IAccountStateDelta.PreviousStateRootHash
property to calculate states until previous action as state root hash. [#1030]
UnexpectedlyTerminatedActionException.PreviousStateRootHash
property. [#1032]
Swarm<T>
.
Transaction<T>.Create()
, Transaction<T>.EvaluateActions()
and Transaction<T>.EvaluateActionsGradually()
no longer throw UnexpectedlyTerminatedActionException
directly. Instead, it records an exception to ActionEvaluation
s. [#860, #875]
Transaction<T>.GenesisHash
property. [#796, #878]
IAccountStateDelta.UpdatedAddresses
property contains asset updates besides state updates. [#861, #900]
BlockChain<T>.Append()
method became to throw InvalidBlockBytesLengthException
if the given block's serialized bytes is longer than the limitation configured by IBlockPolicy.GetMaxBlockBytes()
. [#201, #1050]
BlockChain<T>.MineBlock()
method became to cut off transactions to include to fit into the limitation configured by IBlockPolicy.GetMaxBlockBytes()
. [#201, #1050]
Swarm<T>
became to ignore received transaction with different genesis hash. [#796, #878]
Swarm<T>
became to ignore invalid BlockHeader
s immediately. [#898]
Swarm<T>.PreloadAsync()
became to clean up only temporary chains. [#902]
BlockPolicy<T>
became to validate Block<T>.TotalDifficulty
property of a Block<T>
. [#666, #917]
Swarm<T>
became to preload from peer that has the most difficult chain. [#459, #919]
Swarm<T>
became to promote the most difficult chain as a canonical chain instead of the longest chain. [#459, #919]
Swarm<T>.BootstrapAsync()
method became not to throw TimeoutException
when it fails to connect to all neighbors. [#933]
Swarm<T>
became to respond to the messages with different app protocol version. [#949]
Swarm<T>.PreloadAsync()
became to execute the actions from the branchpoint rather than the genesis block when there is a branch point. [#991]
BlockPolicy<T>
became to validate Block<T>.StateRootHash
property of a Block<T>
. [#986]
Swarm<T>
became not to sync Block<T>
s from the peers with different genesis block. [#1003, #1004]
Swarm<T>
became to ignore BlockHeaderMessage
from the peers with different genesis block. [#1003, #1004]
BlockChain<T>
instead of BlockPolicy<T>
became to validate Block<T>
s to append so that even if an empty implementation of IBlockPolicy<T>
is used Block<T>
s are unable to be appended to BlockChain<T>
. [#1010]
BlockSet<T>[HashDigest<SHA256>]
and BlockChain<T>.Genesis
became cached so that they become faster to get. [#1013]
Swarm<T>.PreloadAsync()
became to do not render blocks. [#1029]
Swarm<T>
had failed to receive a request from TURN relay connections. [#404, #871, #890]
Swarm<T>
had been terminated and never reconnected when it had been once disconnected from TURN (mostly due to sleep mode, etc.). [#909]
Address
when preloading. [#912]
UnexpectedlyTerminatedException
hadn't been serialized with BinaryFormatter
. [#913]
TurnClient
hadn't applied cancellation token to its connections. [#916]
BlockChain<T>.GetRawState()
had overwritten block states without read lock. [#927]
Swarm<T>
had not respond to GetRecentStates
message when the target block does not exist in the chain. [#941]
Swarm<T>.StartAsync()
had not worked after Swarm<T>.StopAsync()
was once called. [#965]
TurnClient
had thrown InvalidOperationException
when reconnecting. [#957, #972]
Swarm<T>
had not received block headers after failing to receive previous blocks. [#996]
Swarm<T>
had thrown InvalidGenesisBlockException
when reorg its chain repeatedly. [#996]
Swarm<T>
had propagated invalid transactions. [#1043]
IAction
implementations. [#1034]
planet
command became installable using npm
. [#923, #982]
planet mpt
. [#1023, #1026]
Published by github-actions[bot] over 4 years ago
Published by github-actions[bot] over 4 years ago
Released on June 2, 2020.
RocksDBStore.DeleteChainId()
method had thrown KeyNotFoundException
when there's no such chain ID. [#891]
RocksDBStore
had written logs into the incorrect context DefaultContext
, not RocksDBStore
the correct one. [#891]