Skip to content

Commit

Permalink
fix: Fix an issue with the evidence hash changing depending on the ve…
Browse files Browse the repository at this point in the history
…rsion.
  • Loading branch information
s2quake committed Jul 11, 2024
1 parent 75b3ae4 commit 6d5cae8
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 19 deletions.
19 changes: 18 additions & 1 deletion src/Libplanet.Types/Evidence/EvidenceBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ public IValue Bencoded
public static IValue Bencode(EvidenceBase evidence)
{
Dictionary bencoded = Dictionary.Empty
.Add(TypeKey, evidence.GetType().AssemblyQualifiedName!)
.Add(TypeKey, GetTypeName(evidence))
.Add(DataKey, evidence.Bencoded);
return bencoded;
}
Expand Down Expand Up @@ -209,6 +209,23 @@ public int CompareTo(object? obj)

public void Verify(IEvidenceContext evidenceContext) => OnVerify(evidenceContext);

internal static string GetTypeName(Type evidenceType)
{
if (!typeof(EvidenceBase).IsAssignableFrom(evidenceType))
{
throw new ArgumentException(
$"Given type {evidenceType} is not a subclass of {nameof(EvidenceBase)}.",
nameof(evidenceType));
}

var typeName = evidenceType.FullName;
var assemblyName = evidenceType.Assembly.GetName().Name;
return $"{typeName}, {assemblyName}";
}

internal static string GetTypeName(EvidenceBase evidence)
=> GetTypeName(evidence.GetType());

protected abstract Dictionary OnBencoded(Dictionary dictionary);

protected abstract void OnVerify(IEvidenceContext evidenceContext);
Expand Down
12 changes: 11 additions & 1 deletion test/Libplanet.Tests/Blockchain/Evidence/EvidenceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,24 @@ public void Decode_WithInvalidEvidenceWithoutConstructor_FailTest()
var bencoded = EvidenceBase.Bencode(evidence);
if (bencoded is Dictionary dictionary)
{
var typeName = typeof(InvalidEvidence).AssemblyQualifiedName;
var typeName = EvidenceBase.GetTypeName(typeof(InvalidEvidence));
bencoded = dictionary.SetItem("type", new Text(typeName));
}

Assert.Throws<NotSupportedException>(
testCode: () => EvidenceBase.Decode(bencoded));
}

[Fact]
public void GetTypeName_Test()
{
var evidenceType = typeof(InvalidEvidence);
var actualTypeName = EvidenceBase.GetTypeName(evidenceType);
var expectedTypeName
= $"{evidenceType.FullName}, {evidenceType.Assembly.GetName().Name}";
Assert.Equal(expectedTypeName, actualTypeName);
}

private sealed class InvalidEvidence : EvidenceBase
{
public InvalidEvidence(long height, Address targetAddress, DateTimeOffset timestamp)
Expand Down
8 changes: 4 additions & 4 deletions test/Libplanet.Tests/Blocks/BlockMetadataTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public void MakeCandidateData()
)
.Add(
"evidence_hash",
ParseHex("1620ee70e94cee1bbead145cd905181ec5a6f21d82a18abf5ca448f83296486f")
ParseHex("bd1b6bc740c7d74fe39f8c78dd6860b7b5bf9c58336a703a583a5a59651a4af3")
);
AssertBencodexEqual(expectedGenesis, GenesisMetadata.MakeCandidateData());

Expand All @@ -156,7 +156,7 @@ public void MakeCandidateData()
.Add("protocol_version", BlockMetadata.CurrentProtocolVersion)
.Add(
"evidence_hash",
ParseHex("2fe13c69db80c99bb0dbd22cd30989fa6e843e780c531ef9a71ac68b8fabfba8")
ParseHex("e7198889cc4a82a8b7be4b7f428b6201400ef222709f756e540b32bc1e8d5d86")
);
AssertBencodexEqual(
expectedBlock1,
Expand All @@ -183,7 +183,7 @@ public void MakeCandidateDataPv1()
)
.Add(
"evidence_hash",
ParseHex("2fe13c69db80c99bb0dbd22cd30989fa6e843e780c531ef9a71ac68b8fabfba8")
ParseHex("e7198889cc4a82a8b7be4b7f428b6201400ef222709f756e540b32bc1e8d5d86")
)
.Add("protocol_version", 1);
AssertBencodexEqual(expected, Block1MetadataPv1.MakeCandidateData());
Expand All @@ -207,7 +207,7 @@ public void DerivePreEvaluationHash()

HashDigest<SHA256> hash = GenesisMetadata.DerivePreEvaluationHash();
AssertBytesEqual(
FromHex("57755b98998adeab81ea1f09702fd353fbc6947531a9259665ae8d6f01d8bbf2"),
FromHex("9ff328716814fed03de454dfc0a9d9aeb0077ad0c393513bf29895a45ded13aa"),
hash.ByteArray);
}

Expand Down
26 changes: 13 additions & 13 deletions test/Libplanet.Tests/Blocks/PreEvaluationBlockHeaderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void MakeCandidateData()
)
.Add(
"evidence_hash",
ParseHex("1620ee70e94cee1bbead145cd905181ec5a6f21d82a18abf5ca448f83296486f")
ParseHex("bd1b6bc740c7d74fe39f8c78dd6860b7b5bf9c58336a703a583a5a59651a4af3")
);
var genesis = new PreEvaluationBlockHeader(
_contents.GenesisMetadata,
Expand Down Expand Up @@ -108,7 +108,7 @@ public void MakeCandidateData()
.Add(
"evidence_hash",
ParseHex(
"2fe13c69db80c99bb0dbd22cd30989fa6e843e780c531ef9a71ac68b8fabfba8"
"e7198889cc4a82a8b7be4b7f428b6201400ef222709f756e540b32bc1e8d5d86"
)
)
.Add("protocol_version", BlockMetadata.CurrentProtocolVersion)
Expand Down Expand Up @@ -181,8 +181,8 @@ public void VerifySignature()

// Same as block1.MakeSignature(_contents.Block1Key, arbitraryHash)
ImmutableArray<byte> validSig = ByteUtil.ParseHexToImmutable(
"304402203a1bd08940dcf10c696bbb04c882bc52d27519512f81a1d38c9d49956aead6" +
"0102201cd079a4e53c3867b4b24542f107e680935b2f369bae4ecd347adc5fedcbaf36");
"3045022100f975e902971092f16dbbb1fe6b7c956de648a8cd62346dbadc07e5fca4ce3" +
"07a02200987a349f0763efd0448659ed66c6bd0ad0971dd57fbb89c672aed592fbd70d6");
AssertBytesEqual(
validSig,
block1.MakeSignature(_contents.Block1Key, arbitraryHash));
Expand All @@ -208,29 +208,29 @@ public void DeriveBlockHash()
{
Func<string, BlockHash> fromHex = BlockHash.FromString;
HashDigest<SHA256> arbitraryHash = HashDigest<SHA256>.FromString(
"e6b3803208416556db8de50670aaf0b642e13c90afd77d24da8f642dc3e8f320"
"9db253bdb987ec93df713522e5f90f4865a2d0fa337481d7a065d588ddae7fa7"
);

var genesis = new PreEvaluationBlockHeader(
_contents.GenesisMetadata,
_contents.GenesisMetadata.DerivePreEvaluationHash());
AssertBytesEqual(
fromHex("6b985ae01bde1f20cc2540d573e8ef29fa6850d5c5fed11b5f16f6725f4f9279"),
fromHex("d790aa3b2d985d58e6fe6547336ca9d2bfdb749a27cd58a17dbfd0c6880da8e3"),
genesis.DeriveBlockHash(default, null)
);
AssertBytesEqual(
fromHex("4eabde1d1cffe6d757d45ee06ec2df06b3348df4019960be82a2f60b9a9aa824"),
fromHex("47b5227dfdd99af4faf9ae9e82ef3b615063179d275081eae4c122685bbf7dcb"),
genesis.DeriveBlockHash(
default,
genesis.MakeSignature(_contents.GenesisKey, default)
)
);
AssertBytesEqual(
fromHex("32a983fd82abe6fae843f1719b53782eae55c4cdcf7698b30898369281f6a913"),
fromHex("2c45bb52e4c7d79caa28da9b63ec0f492262836c975bfa5bb27f62e96f2aad99"),
genesis.DeriveBlockHash(arbitraryHash, null)
);
AssertBytesEqual(
fromHex("7bda8e4ea57963b105c6420f0374ddaf5bb27e9c7fa7e34785bd21c44c8d46a1"),
fromHex("e985fcdce3f73dee90a4eaec9399283f856bb6f9326e4300bbe1d6126ff7ad55"),
genesis.DeriveBlockHash(
arbitraryHash,
genesis.MakeSignature(_contents.GenesisKey, arbitraryHash))
Expand All @@ -240,19 +240,19 @@ public void DeriveBlockHash()
_contents.Block1Metadata,
_contents.Block1Metadata.DerivePreEvaluationHash());
AssertBytesEqual(
fromHex("d4e6f3193e0fe5891667deeb112daceef91ca42946696943726bf3cecf1bb07f"),
fromHex("ade696a646c9e4321cc90160807cba3d15d7cd28556d2dfb4103e8730a46038c"),
block1.DeriveBlockHash(default, null)
);
AssertBytesEqual(
fromHex("9e32da9a1127f8a7cf3d127f871664aed86d7c629dba1574d018c7322600b3e3"),
fromHex("b3157a151d2168653e21ffc850f9d1a96bca6310275cccbeb9bd705f67c2e1c9"),
block1.DeriveBlockHash(default, block1.MakeSignature(_contents.Block1Key, default))
);
AssertBytesEqual(
fromHex("4ea630fb80d6235a5a7433b8935bac389c5dab486dd9c8dd24a840733ae5ce06"),
fromHex("3fd4ee37ed2fc5dae5a9533984f06b3975e176bdaa70689a3c14acd8b4ea384d"),
block1.DeriveBlockHash(arbitraryHash, null)
);
AssertBytesEqual(
fromHex("e86d8b1d9e37ffd051fcbc9ece3cc112f87b8653e5cf4e7c34a5cae4e9594624"),
fromHex("83ceb4d1e5bbc385daaebfd044a5e4ba65bf1d8b63ef0aabe4d68fc5642b4516"),
block1.DeriveBlockHash(
arbitraryHash, block1.MakeSignature(_contents.Block1Key, arbitraryHash)
)
Expand Down

0 comments on commit 6d5cae8

Please sign in to comment.