Update SF to latest spec (#1386)

* Introduce whitelist for softfork

* Use extradata for fork id.

* Fix condition.
This commit is contained in:
Gav Wood 2016-06-22 15:37:25 +02:00 committed by GitHub
parent 11314a660d
commit 353b9e91e6
2 changed files with 22 additions and 12 deletions

View File

@ -226,15 +226,21 @@ impl State {
// dao attack soft fork // dao attack soft fork
if engine.schedule(&env_info).reject_dao_transactions { if engine.schedule(&env_info).reject_dao_transactions {
// collect all the addresses which have changed. let whitelisted = if let Action::Call(to) = t.action {
let addresses = self.cache.borrow().iter().map(|(addr, _)| addr.clone()).collect::<Vec<_>>(); to == Address::from("Da4a4626d3E16e094De3225A751aAb7128e96526") ||
to == Address::from("2ba9D006C1D72E67A70b5526Fc6b4b0C0fd6D334")
} else { false };
if !whitelisted {
// collect all the addresses which have changed.
let addresses = self.cache.borrow().iter().map(|(addr, _)| addr.clone()).collect::<Vec<_>>();
for a in &addresses { for a in &addresses {
if self.code(a).map_or(false, |c| c.sha3() == broken_dao) { if self.code(a).map_or(false, |c| c.sha3() == broken_dao) {
// Figure out if the balance has been reduced. // Figure out if the balance has been reduced.
let maybe_original = SecTrieDB::new(self.db.as_hashdb(), &self.root).expect(SEC_TRIE_DB_UNWRAP_STR).get(&a).map(Account::from_rlp); let maybe_original = SecTrieDB::new(self.db.as_hashdb(), &self.root).expect(SEC_TRIE_DB_UNWRAP_STR).get(&a).map(Account::from_rlp);
if maybe_original.map_or(false, |original| *original.balance() > self.balance(a)) { if maybe_original.map_or(false, |original| *original.balance() > self.balance(a)) {
return Err(Error::Transaction(TransactionError::DAORescue)); return Err(Error::Transaction(TransactionError::DAORescue));
}
} }
} }
} }

View File

@ -121,10 +121,14 @@ impl Configuration {
} }
pub fn extra_data(&self) -> Bytes { pub fn extra_data(&self) -> Bytes {
match self.args.flag_extradata.as_ref().or(self.args.flag_extra_data.as_ref()) { if !self.args.flag_dont_help_rescue_dao {
Some(ref x) if x.len() <= 32 => x.as_bytes().to_owned(), (b"rescuedao"[..]).to_owned()
None => version_data(), } else {
Some(ref x) => { die!("{}: Extra data must be at most 32 characters.", x); } match self.args.flag_extradata.as_ref().or(self.args.flag_extra_data.as_ref()) {
Some(ref x) if x.len() <= 32 => x.as_bytes().to_owned(),
None => version_data(),
Some(ref x) => { die!("{}: Extra data must be at most 32 characters.", x); }
}
} }
} }