mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Correct order of nonce/balance. PROTOCOL CHANGE! NEW CHAIN!
Extra paranoia for trie. Trie fixes. Trie tests. Version bump.
This commit is contained in:
parent
3aa823b55e
commit
45ed60a2a2
35
main.cpp
35
main.cpp
@ -42,41 +42,6 @@ using namespace eth;
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(basic_tests)
|
BOOST_AUTO_TEST_CASE(basic_tests)
|
||||||
{
|
{
|
||||||
cdebug << "Stress-testing Trie...";
|
|
||||||
{
|
|
||||||
BasicMap m;
|
|
||||||
EnforceRefs e(m, true);
|
|
||||||
GenericTrieDB<BasicMap> d(&m);
|
|
||||||
d.init(); // initialise as empty tree.
|
|
||||||
MemTrie t;
|
|
||||||
assert(d.check().empty());
|
|
||||||
for (int a = 0; a < 100; ++a)
|
|
||||||
{
|
|
||||||
StringMap m;
|
|
||||||
for (int i = 0; i < 100; ++i)
|
|
||||||
{
|
|
||||||
auto k = randomWord();
|
|
||||||
auto v = toString(i);
|
|
||||||
m.insert(make_pair(k, v));
|
|
||||||
t.insert(k, v);
|
|
||||||
d.insert(k, v);
|
|
||||||
assert(hash256(m) == t.hash256());
|
|
||||||
assert(hash256(m) == d.root());
|
|
||||||
assert(d.check().empty());
|
|
||||||
}
|
|
||||||
while (!m.empty())
|
|
||||||
{
|
|
||||||
auto k = m.begin()->first;
|
|
||||||
d.remove(k);
|
|
||||||
t.remove(k);
|
|
||||||
m.erase(k);
|
|
||||||
assert(hash256(m) == t.hash256());
|
|
||||||
assert(hash256(m) == d.root());
|
|
||||||
assert(d.check().empty());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* RLPStream s;
|
/* RLPStream s;
|
||||||
BlockInfo::genesis().fillStream(s, false);
|
BlockInfo::genesis().fillStream(s, false);
|
||||||
std::cout << RLP(s.out()) << std::endl;
|
std::cout << RLP(s.out()) << std::endl;
|
||||||
|
102
trie.cpp
102
trie.cpp
@ -49,7 +49,6 @@ namespace eth
|
|||||||
BOOST_AUTO_TEST_CASE(trie_tests)
|
BOOST_AUTO_TEST_CASE(trie_tests)
|
||||||
{
|
{
|
||||||
cnote << "Testing Trie...";
|
cnote << "Testing Trie...";
|
||||||
|
|
||||||
js::mValue v;
|
js::mValue v;
|
||||||
string s = asString(contents("../../../tests/trietest.json"));
|
string s = asString(contents("../../../tests/trietest.json"));
|
||||||
BOOST_REQUIRE_MESSAGE( s.length() > 0, "Contents of 'trietest.json' is empty. Have you cloned the 'tests' repo branch develop?");
|
BOOST_REQUIRE_MESSAGE( s.length() > 0, "Contents of 'trietest.json' is empty. Have you cloned the 'tests' repo branch develop?");
|
||||||
@ -57,7 +56,7 @@ BOOST_AUTO_TEST_CASE(trie_tests)
|
|||||||
for (auto& i: v.get_obj())
|
for (auto& i: v.get_obj())
|
||||||
{
|
{
|
||||||
js::mObject& o = i.second.get_obj();
|
js::mObject& o = i.second.get_obj();
|
||||||
cnote << i.first;
|
// cnote << i.first;
|
||||||
vector<pair<string, string>> ss;
|
vector<pair<string, string>> ss;
|
||||||
for (auto& i: o["in"].get_obj())
|
for (auto& i: o["in"].get_obj())
|
||||||
ss.push_back(make_pair(i.first, i.second.get_str()));
|
ss.push_back(make_pair(i.first, i.second.get_str()));
|
||||||
@ -67,8 +66,13 @@ BOOST_AUTO_TEST_CASE(trie_tests)
|
|||||||
BasicMap m;
|
BasicMap m;
|
||||||
GenericTrieDB<BasicMap> t(&m);
|
GenericTrieDB<BasicMap> t(&m);
|
||||||
t.init();
|
t.init();
|
||||||
|
BOOST_REQUIRE(t.check(true));
|
||||||
for (auto const& k: ss)
|
for (auto const& k: ss)
|
||||||
|
{
|
||||||
|
// cdebug << k.first << k.second;
|
||||||
t.insert(k.first, k.second);
|
t.insert(k.first, k.second);
|
||||||
|
BOOST_REQUIRE(t.check(true));
|
||||||
|
}
|
||||||
BOOST_REQUIRE(!o["root"].is_null());
|
BOOST_REQUIRE(!o["root"].is_null());
|
||||||
BOOST_CHECK(o["root"].get_str() == toHex(t.root().asArray()) );
|
BOOST_CHECK(o["root"].get_str() == toHex(t.root().asArray()) );
|
||||||
}
|
}
|
||||||
@ -81,8 +85,9 @@ inline h256 stringMapHash256(StringMap const& _s)
|
|||||||
return hash256(_s);
|
return hash256(_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
int trieTest()
|
BOOST_AUTO_TEST_CASE(moreTrieTests)
|
||||||
{
|
{
|
||||||
|
cnote << "Testing Trie more...";
|
||||||
#if 0
|
#if 0
|
||||||
// More tests...
|
// More tests...
|
||||||
{
|
{
|
||||||
@ -153,6 +158,7 @@ int trieTest()
|
|||||||
cout << RLP(t.rlp()) << endl;
|
cout << RLP(t.rlp()) << endl;
|
||||||
cout << toHex(t.rlp()) << endl;
|
cout << toHex(t.rlp()) << endl;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
BasicMap m;
|
BasicMap m;
|
||||||
GenericTrieDB<BasicMap> d(&m);
|
GenericTrieDB<BasicMap> d(&m);
|
||||||
@ -166,20 +172,21 @@ int trieTest()
|
|||||||
t.insert(a, b);
|
t.insert(a, b);
|
||||||
s[a] = b;
|
s[a] = b;
|
||||||
|
|
||||||
cout << endl << "-------------------------------" << endl;
|
/*cout << endl << "-------------------------------" << endl;
|
||||||
cout << a << " -> " << b << endl;
|
cout << a << " -> " << b << endl;
|
||||||
cout << d;
|
cout << d;
|
||||||
cout << m;
|
cout << m;
|
||||||
cout << d.root() << endl;
|
cout << d.root() << endl;
|
||||||
cout << hash256(s) << endl;
|
cout << hash256(s) << endl;*/
|
||||||
|
|
||||||
assert(t.hash256() == hash256(s));
|
BOOST_REQUIRE(d.check(true));
|
||||||
assert(d.root() == hash256(s));
|
BOOST_REQUIRE_EQUAL(t.hash256(), hash256(s));
|
||||||
|
BOOST_REQUIRE_EQUAL(d.root(), hash256(s));
|
||||||
for (auto const& i: s)
|
for (auto const& i: s)
|
||||||
{
|
{
|
||||||
(void)i;
|
(void)i;
|
||||||
assert(t.at(i.first) == i.second);
|
BOOST_REQUIRE_EQUAL(t.at(i.first), i.second);
|
||||||
assert(d.at(i.first) == i.second);
|
BOOST_REQUIRE_EQUAL(d.at(i.first), i.second);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -189,22 +196,23 @@ int trieTest()
|
|||||||
t.remove(a);
|
t.remove(a);
|
||||||
d.remove(string(a));
|
d.remove(string(a));
|
||||||
|
|
||||||
cout << endl << "-------------------------------" << endl;
|
/*cout << endl << "-------------------------------" << endl;
|
||||||
cout << "X " << a << endl;
|
cout << "X " << a << endl;
|
||||||
cout << d;
|
cout << d;
|
||||||
cout << m;
|
cout << m;
|
||||||
cout << d.root() << endl;
|
cout << d.root() << endl;
|
||||||
cout << hash256(s) << endl;
|
cout << hash256(s) << endl;*/
|
||||||
|
|
||||||
assert(t.at(a).empty());
|
BOOST_REQUIRE(d.check(true));
|
||||||
assert(d.at(string(a)).empty());
|
BOOST_REQUIRE(t.at(a).empty());
|
||||||
assert(t.hash256() == hash256(s));
|
BOOST_REQUIRE(d.at(string(a)).empty());
|
||||||
assert(d.root() == hash256(s));
|
BOOST_REQUIRE_EQUAL(t.hash256(), hash256(s));
|
||||||
|
BOOST_REQUIRE_EQUAL(d.root(), hash256(s));
|
||||||
for (auto const& i: s)
|
for (auto const& i: s)
|
||||||
{
|
{
|
||||||
(void)i;
|
(void)i;
|
||||||
assert(t.at(i.first) == i.second);
|
BOOST_REQUIRE_EQUAL(t.at(i.first), i.second);
|
||||||
assert(d.at(i.first) == i.second);
|
BOOST_REQUIRE_EQUAL(d.at(i.first), i.second);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -219,36 +227,78 @@ int trieTest()
|
|||||||
remove("doge");
|
remove("doge");
|
||||||
remove("doe");
|
remove("doe");
|
||||||
}
|
}
|
||||||
#endif
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(trieStess)
|
||||||
|
{
|
||||||
|
cnote << "Stress-testing Trie...";
|
||||||
{
|
{
|
||||||
BasicMap m;
|
BasicMap m;
|
||||||
GenericTrieDB<BasicMap> d(&m);
|
BasicMap dm;
|
||||||
|
EnforceRefs e(dm, true);
|
||||||
|
GenericTrieDB<BasicMap> d(&dm);
|
||||||
d.init(); // initialise as empty tree.
|
d.init(); // initialise as empty tree.
|
||||||
MemTrie t;
|
MemTrie t;
|
||||||
|
BOOST_REQUIRE(d.check(true));
|
||||||
for (int a = 0; a < 20; ++a)
|
for (int a = 0; a < 20; ++a)
|
||||||
{
|
{
|
||||||
StringMap m;
|
StringMap m;
|
||||||
for (int i = 0; i < 20; ++i)
|
for (int i = 0; i < 50; ++i)
|
||||||
{
|
{
|
||||||
auto k = randomWord();
|
auto k = randomWord();
|
||||||
auto v = toString(i);
|
auto v = toString(i);
|
||||||
m.insert(make_pair(k, v));
|
m[k] = v;
|
||||||
t.insert(k, v);
|
t.insert(k, v);
|
||||||
d.insert(k, v);
|
d.insert(k, v);
|
||||||
assert(hash256(m) == t.hash256());
|
BOOST_REQUIRE_EQUAL(hash256(m), t.hash256());
|
||||||
assert(hash256(m) == d.root());
|
BOOST_REQUIRE_EQUAL(hash256(m), d.root());
|
||||||
|
BOOST_REQUIRE(d.check(true));
|
||||||
}
|
}
|
||||||
while (!m.empty())
|
while (!m.empty())
|
||||||
{
|
{
|
||||||
auto k = m.begin()->first;
|
auto k = m.begin()->first;
|
||||||
|
auto v = m.begin()->second;
|
||||||
d.remove(k);
|
d.remove(k);
|
||||||
t.remove(k);
|
t.remove(k);
|
||||||
m.erase(k);
|
m.erase(k);
|
||||||
assert(hash256(m) == t.hash256());
|
if (!d.check(true))
|
||||||
assert(hash256(m) == d.root());
|
{
|
||||||
|
cwarn << m;
|
||||||
|
for (auto i: d)
|
||||||
|
cwarn << i.first.toString() << i.second.toString();
|
||||||
|
|
||||||
|
BasicMap dm2;
|
||||||
|
EnforceRefs e2(dm2, true);
|
||||||
|
GenericTrieDB<BasicMap> d2(&dm2);
|
||||||
|
d2.init(); // initialise as empty tree.
|
||||||
|
for (auto i: d)
|
||||||
|
d2.insert(i.first, i.second);
|
||||||
|
|
||||||
|
cwarn << "Good:" << d2.root();
|
||||||
|
// for (auto i: dm2.get())
|
||||||
|
// cwarn << i.first.abridged() << ": " << RLP(i.second);
|
||||||
|
d2.debugStructure(cerr);
|
||||||
|
cwarn << "Broken:" << d.root(); // Leaves an extension -> extension (3c1... -> 742...)
|
||||||
|
// for (auto i: dm.get())
|
||||||
|
// cwarn << i.first.abridged() << ": " << RLP(i.second);
|
||||||
|
d.debugStructure(cerr);
|
||||||
|
|
||||||
|
d2.insert(k, v);
|
||||||
|
cwarn << "Pres:" << d2.root();
|
||||||
|
// for (auto i: dm2.get())
|
||||||
|
// cwarn << i.first.abridged() << ": " << RLP(i.second);
|
||||||
|
d2.debugStructure(cerr);
|
||||||
|
g_logVerbosity = 99;
|
||||||
|
d2.remove(k);
|
||||||
|
g_logVerbosity = 4;
|
||||||
|
|
||||||
|
cwarn << "Good?" << d2.root();
|
||||||
|
}
|
||||||
|
BOOST_REQUIRE(d.check(true));
|
||||||
|
BOOST_REQUIRE_EQUAL(hash256(m), t.hash256());
|
||||||
|
BOOST_REQUIRE_EQUAL(hash256(m), d.root());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user