Browse Source

API cleanups and some renaming.

cl-refactor
Gav Wood 11 years ago
parent
commit
e8a1e3b46d
  1. 30
      alethzero/MainWin.cpp
  2. 6
      eth/main.cpp
  3. 4
      libethereum/Client.cpp
  4. 8
      libethereum/Client.h
  5. 15
      libethereum/ExtVMFace.h
  6. 20
      libethereum/State.cpp
  7. 17
      libethereum/State.h
  8. 24
      libethereum/VM.h
  9. 32
      test/vm.cpp
  10. 4
      walleth/MainWin.cpp

30
alethzero/MainWin.cpp

@ -126,7 +126,7 @@ inline h256 fromAddress(Address _a)
QString Main::pretty(eth::Address _a) const QString Main::pretty(eth::Address _a) const
{ {
if (h256 n = state().contractMemory(m_nameReg, fromAddress(_a))) if (h256 n = state().contractStorage(m_nameReg, fromAddress(_a)))
{ {
std::string s((char const*)n.data(), 32); std::string s((char const*)n.data(), 32);
if (s.find_first_of('\0') != string::npos) if (s.find_first_of('\0') != string::npos)
@ -153,8 +153,8 @@ Address Main::fromString(QString const& _a) const
memcpy(n.data(), sn.data(), sn.size()); memcpy(n.data(), sn.data(), sn.size());
memset(n.data() + sn.size(), 0, 32 - sn.size()); memset(n.data() + sn.size(), 0, 32 - sn.size());
if (_a.size()) if (_a.size())
if (h256 a = state().contractMemory(m_nameReg, n)) if (h256 a = state().contractStorage(m_nameReg, n))
return left160(a); return right160(a);
if (_a.size() == 40) if (_a.size() == 40)
return Address(fromHex(_a.toStdString())); return Address(fromHex(_a.toStdString()));
else else
@ -296,7 +296,7 @@ void Main::refresh(bool _override)
QString("%2 +> %3: %1 [%4]") QString("%2 +> %3: %1 [%4]")
.arg(formatBalance(t.value).c_str()) .arg(formatBalance(t.value).c_str())
.arg(render(t.safeSender())) .arg(render(t.safeSender()))
.arg(render(left160(sha3(rlpList(t.safeSender(), t.nonce))))) .arg(render(right160(sha3(rlpList(t.safeSender(), t.nonce)))))
.arg((unsigned)t.nonce); .arg((unsigned)t.nonce);
ui->transactionQueue->addItem(s); ui->transactionQueue->addItem(s);
} }
@ -322,7 +322,7 @@ void Main::refresh(bool _override)
QString(" %2 +> %3: %1 [%4]") QString(" %2 +> %3: %1 [%4]")
.arg(formatBalance(t.value).c_str()) .arg(formatBalance(t.value).c_str())
.arg(render(t.safeSender())) .arg(render(t.safeSender()))
.arg(render(left160(sha3(rlpList(t.safeSender(), t.nonce))))) .arg(render(right160(sha3(rlpList(t.safeSender(), t.nonce)))))
.arg((unsigned)t.nonce); .arg((unsigned)t.nonce);
QListWidgetItem* txItem = new QListWidgetItem(s, ui->blocks); QListWidgetItem* txItem = new QListWidgetItem(s, ui->blocks);
txItem->setData(Qt::UserRole, QByteArray((char const*)h.data(), h.size)); txItem->setData(Qt::UserRole, QByteArray((char const*)h.data(), h.size));
@ -405,7 +405,7 @@ void Main::on_blocks_currentItemChanged()
s << "<h4>" << h << "[<b>" << txi << "</b>]</h4>"; s << "<h4>" << h << "[<b>" << txi << "</b>]</h4>";
s << "<br/>From: <b>" << pretty(ss).toStdString() << "</b> " << ss; s << "<br/>From: <b>" << pretty(ss).toStdString() << "</b> " << ss;
if (tx.isCreation()) if (tx.isCreation())
s << "<br/>Creates: <b>" << pretty(left160(th)).toStdString() << "</b> " << left160(th); s << "<br/>Creates: <b>" << pretty(right160(th)).toStdString() << "</b> " << right160(th);
else else
s << "<br/>To: <b>" << pretty(tx.receiveAddress).toStdString() << "</b> " << tx.receiveAddress; s << "<br/>To: <b>" << pretty(tx.receiveAddress).toStdString() << "</b> " << tx.receiveAddress;
s << "<br/>Value: <b>" << formatBalance(tx.value) << "</b>"; s << "<br/>Value: <b>" << formatBalance(tx.value) << "</b>";
@ -445,7 +445,7 @@ void Main::on_contracts_currentItemChanged()
auto h = h160((byte const*)hba.data(), h160::ConstructFromPointer); auto h = h160((byte const*)hba.data(), h160::ConstructFromPointer);
stringstream s; stringstream s;
auto mem = state().contractMemory(h); auto mem = state().contractStorage(h);
for (auto const& i: mem) for (auto const& i: mem)
s << "@" << showbase << hex << i.first << "&nbsp;&nbsp;&nbsp;&nbsp;" << showbase << hex << i.second << "<br/>"; s << "@" << showbase << hex << i.first << "&nbsp;&nbsp;&nbsp;&nbsp;" << showbase << hex << i.second << "<br/>";
s << "<br/>Code:"; s << "<br/>Code:";
@ -520,7 +520,7 @@ void Main::on_data_textChanged()
while (s.size()) while (s.size())
{ {
QRegExp r("@?\"(.*)\"(.*)"); QRegExp r("@?\"(.*)\"(.*)");
QRegExp h("([a-fA-F0-9][a-fA-F0-9])(.*)"); QRegExp h("@?(0x)?(([a-fA-F0-9][a-fA-F0-9])+)(.*)");
if (r.exactMatch(s)) if (r.exactMatch(s))
{ {
for (auto i: r.cap(1)) for (auto i: r.cap(1))
@ -534,8 +534,14 @@ void Main::on_data_textChanged()
} }
else if (h.exactMatch(s)) else if (h.exactMatch(s))
{ {
m_data.push_back(fromHex(h.cap(1).toStdString())[0]); if (s[0] == '@')
s = h.cap(2); {
bytes bs = fromHex(h.cap(2).toStdString());
for (auto b: bs)
m_data.push_back(b);
}
s = h.cap(4);
} }
else else
s = s.mid(1); s = s.mid(1);
@ -669,9 +675,9 @@ void Main::on_send_clicked()
m_client->unlock(); m_client->unlock();
Secret s = i.secret(); Secret s = i.secret();
if (isCreation()) if (isCreation())
m_client->transact(s, value(), gasPrice(), ui->gas->value(), m_data, m_init); m_client->transact(s, value(), m_data, m_init, ui->gas->value(), gasPrice());
else else
m_client->transact(s, value(), gasPrice(), ui->gas->value(), fromString(ui->destination->text()), m_data); m_client->transact(s, value(), fromString(ui->destination->text()), m_data, ui->gas->value(), gasPrice());
refresh(); refresh();
return; return;
} }

6
eth/main.cpp

@ -522,7 +522,7 @@ int main(int argc, char** argv)
Address dest = h160(fromHex(rechex)); Address dest = h160(fromHex(rechex));
bytes data; bytes data;
c.transact(secret, amount, gasPrice, gas, dest, data); c.transact(secret, amount, dest, data, gas, gasPrice);
} }
else if (cmd == "send") else if (cmd == "send")
{ {
@ -533,7 +533,7 @@ int main(int argc, char** argv)
iss >> rechex >> amount >> gasPrice >> gas; iss >> rechex >> amount >> gasPrice >> gas;
Address dest = h160(fromHex(rechex)); Address dest = h160(fromHex(rechex));
c.transact(us.secret(), amount, gasPrice, gas, dest, bytes()); c.transact(us.secret(), amount, dest, bytes(), gas, gasPrice);
} }
else if (cmd == "inspect") else if (cmd == "inspect")
{ {
@ -548,7 +548,7 @@ int main(int argc, char** argv)
auto h = h160(fromHex(rechex)); auto h = h160(fromHex(rechex));
stringstream s; stringstream s;
auto mem = c.state().contractMemory(h); auto mem = c.state().contractStorage(h);
u256 next = 0; u256 next = 0;
unsigned numerics = 0; unsigned numerics = 0;
bool unexpectedNumeric = false; bool unexpectedNumeric = false;

4
libethereum/Client.cpp

@ -140,7 +140,7 @@ void Client::stopMining()
m_doMine = false; m_doMine = false;
} }
void Client::transact(Secret _secret, u256 _value, u256 _gasPrice, u256 _gas, Address _dest, bytes const& _data) void Client::transact(Secret _secret, u256 _value, Address _dest, bytes const& _data, u256 _gas, u256 _gasPrice)
{ {
lock_guard<recursive_mutex> l(m_lock); lock_guard<recursive_mutex> l(m_lock);
Transaction t; Transaction t;
@ -156,7 +156,7 @@ void Client::transact(Secret _secret, u256 _value, u256 _gasPrice, u256 _gas, Ad
m_changed = true; m_changed = true;
} }
void Client::transact(Secret _secret, u256 _endowment, u256 _gasPrice, u256 _gas, bytes const& _code, bytes const& _init) void Client::transact(Secret _secret, u256 _endowment, bytes const& _code, bytes const& _init, u256 _gas, u256 _gasPrice)
{ {
lock_guard<recursive_mutex> l(m_lock); lock_guard<recursive_mutex> l(m_lock);
Transaction t; Transaction t;

8
libethereum/Client.h

@ -83,11 +83,11 @@ public:
/// Destructor. /// Destructor.
~Client(); ~Client();
/// Submits the given transaction. /// Submits the given message-call transaction.
void transact(Secret _secret, u256 _value, u256 _gasPrice, u256 _gas, Address _dest, bytes const& _data); void transact(Secret _secret, u256 _value, Address _dest, bytes const& _data = bytes(), u256 _gas = 10000, u256 _gasPrice = 10 * szabo);
/// Submits a new contract. /// Submits a new contract-creation transaction.
void transact(Secret _secret, u256 _endowment, u256 _gasPrice, u256 _gas, bytes const& _code, bytes const& _init); void transact(Secret _secret, u256 _endowment, bytes const& _code, bytes const& _init = bytes(), u256 _gas = 10000, u256 _gasPrice = 10 * szabo);
/// Makes the given call. Nothing is recorded into the state. TODO /// Makes the given call. Nothing is recorded into the state. TODO
// bytes call(Secret _secret, u256 _amount, u256 _gasPrice, Address _dest, u256 _gas, bytes _data = bytes()); // bytes call(Secret _secret, u256 _amount, u256 _gasPrice, Address _dest, u256 _gas, bytes _data = bytes());

15
libethereum/ExtVMFace.h

@ -41,12 +41,13 @@ public:
currentNumber(_currentNumber) currentNumber(_currentNumber)
{} {}
ExtVMFace(Address _myAddress, Address _txSender, u256 _txValue, u256 _gasPrice, bytesConstRef _txData, bytesConstRef _code, BlockInfo const& _previousBlock, BlockInfo const& _currentBlock, uint _currentNumber): ExtVMFace(Address _myAddress, Address _caller, Address _origin, u256 _value, u256 _gasPrice, bytesConstRef _data, bytesConstRef _code, BlockInfo const& _previousBlock, BlockInfo const& _currentBlock, uint _currentNumber):
myAddress(_myAddress), myAddress(_myAddress),
txSender(_txSender), caller(_caller),
txValue(_txValue), origin(_origin),
value(_value),
gasPrice(_gasPrice), gasPrice(_gasPrice),
txData(_txData), data(_data),
code(_code), code(_code),
previousBlock(_previousBlock), previousBlock(_previousBlock),
currentBlock(_currentBlock), currentBlock(_currentBlock),
@ -72,11 +73,11 @@ public:
#pragma warning(pop) #pragma warning(pop)
Address myAddress; Address myAddress;
Address txSender; Address caller;
Address origin; Address origin;
u256 txValue; u256 value;
u256 gasPrice; u256 gasPrice;
bytesConstRef txData; bytesConstRef data;
bytesConstRef code; bytesConstRef code;
BlockInfo previousBlock; ///< The current block's information. BlockInfo previousBlock; ///< The current block's information.
BlockInfo currentBlock; ///< The current block's information. BlockInfo currentBlock; ///< The current block's information.

20
libethereum/State.cpp

@ -566,7 +566,7 @@ u256 State::transactionsFrom(Address _id) const
return it->second.nonce(); return it->second.nonce();
} }
u256 State::contractMemory(Address _id, u256 _memory) const u256 State::contractStorage(Address _id, u256 _memory) const
{ {
ensureCached(_id, false, false); ensureCached(_id, false, false);
auto it = m_cache.find(_id); auto it = m_cache.find(_id);
@ -585,7 +585,7 @@ u256 State::contractMemory(Address _id, u256 _memory) const
return ret.size() ? RLP(ret).toInt<u256>() : 0; return ret.size() ? RLP(ret).toInt<u256>() : 0;
} }
map<u256, u256> const& State::contractMemory(Address _contract) const map<u256, u256> const& State::contractStorage(Address _contract) const
{ {
if (!isContractAddress(_contract)) if (!isContractAddress(_contract))
return EmptyMapU256U256; return EmptyMapU256U256;
@ -676,15 +676,18 @@ void State::execute(bytesConstRef _rlp)
m_transactionSet.insert(t.sha3()); m_transactionSet.insert(t.sha3());
} }
bool State::call(Address _receiveAddress, Address _sendAddress, u256 _value, u256 _gasPrice, bytesConstRef _data, u256* _gas, bytesRef _out) bool State::call(Address _receiveAddress, Address _senderAddress, u256 _value, u256 _gasPrice, bytesConstRef _data, u256* _gas, bytesRef _out, Address _originAddress)
{ {
if (!_originAddress)
_originAddress = _senderAddress;
cnote << "Transferring" << formatBalance(_value) << "to receiver."; cnote << "Transferring" << formatBalance(_value) << "to receiver.";
addBalance(_receiveAddress, _value); addBalance(_receiveAddress, _value);
if (isContractAddress(_receiveAddress)) if (isContractAddress(_receiveAddress))
{ {
VM vm(*_gas); VM vm(*_gas);
ExtVM evm(*this, _receiveAddress, _sendAddress, _value, _gasPrice, _data, &contractCode(_receiveAddress)); ExtVM evm(*this, _receiveAddress, _senderAddress, _originAddress, _value, _gasPrice, _data, &contractCode(_receiveAddress));
bool revert = false; bool revert = false;
try try
@ -721,9 +724,12 @@ bool State::call(Address _receiveAddress, Address _sendAddress, u256 _value, u25
return true; return true;
} }
h160 State::create(Address _sender, u256 _endowment, u256 _gasPrice, u256* _gas, bytesConstRef _code, bytesConstRef _init) h160 State::create(Address _sender, u256 _endowment, u256 _gasPrice, u256* _gas, bytesConstRef _code, bytesConstRef _init, Address _origin)
{ {
Address newAddress = left160(sha3(rlpList(_sender, transactionsFrom(_sender) - 1))); if (!_origin)
_origin = _sender;
Address newAddress = right160(sha3(rlpList(_sender, transactionsFrom(_sender) - 1)));
while (isContractAddress(newAddress) || isNormalAddress(newAddress)) while (isContractAddress(newAddress) || isNormalAddress(newAddress))
newAddress = (u160)newAddress + 1; newAddress = (u160)newAddress + 1;
@ -732,7 +738,7 @@ h160 State::create(Address _sender, u256 _endowment, u256 _gasPrice, u256* _gas,
// Execute _init. // Execute _init.
VM vm(*_gas); VM vm(*_gas);
ExtVM evm(*this, newAddress, _sender, _endowment, _gasPrice, bytesConstRef(), _init); ExtVM evm(*this, newAddress, _sender, _origin, _endowment, _gasPrice, bytesConstRef(), _init);
bool revert = false; bool revert = false;
try try

17
libethereum/State.h

@ -147,11 +147,11 @@ public:
/// Get the value of a memory position of a contract. /// Get the value of a memory position of a contract.
/// @returns 0 if no contract exists at that address. /// @returns 0 if no contract exists at that address.
u256 contractMemory(Address _contract, u256 _memory) const; u256 contractStorage(Address _contract, u256 _memory) const;
/// Get the memory of a contract. /// Get the memory of a contract.
/// @returns std::map<u256, u256> if no contract exists at that address. /// @returns std::map<u256, u256> if no contract exists at that address.
std::map<u256, u256> const& contractMemory(Address _contract) const; std::map<u256, u256> const& contractStorage(Address _contract) const;
/// Get the code of a contract. /// Get the code of a contract.
/// @returns bytes() if no contract exists at that address. /// @returns bytes() if no contract exists at that address.
@ -207,13 +207,12 @@ private:
// We assume all instrinsic fees are paid up before this point. // We assume all instrinsic fees are paid up before this point.
/// Execute a contract-creation transaction. /// Execute a contract-creation transaction.
h160 create(Address _txSender, u256 _endowment, u256 _gasPrice, u256* _gas, bytesConstRef _code, bytesConstRef _init); h160 create(Address _txSender, u256 _endowment, u256 _gasPrice, u256* _gas, bytesConstRef _code, bytesConstRef _init, Address _originAddress = Address());
h160 create(Transaction const& _t, Address _sender, u256* _gas);
/// Execute a call. /// Execute a call.
/// @a _gas points to the amount of gas to use for the call, and will lower it accordingly. /// @a _gas points to the amount of gas to use for the call, and will lower it accordingly.
/// @returns false if the call ran out of gas before completion. true otherwise. /// @returns false if the call ran out of gas before completion. true otherwise.
bool call(Address _myAddress, Address _txSender, u256 _txValue, u256 _gasPrice, bytesConstRef _txData, u256* _gas, bytesRef _out); bool call(Address _myAddress, Address _txSender, u256 _txValue, u256 _gasPrice, bytesConstRef _txData, u256* _gas, bytesRef _out, Address _originAddress = Address());
/// Sets m_currentBlock to a clean state, (i.e. no change from m_previousBlock). /// Sets m_currentBlock to a clean state, (i.e. no change from m_previousBlock).
void resetCurrent(); void resetCurrent();
@ -253,8 +252,8 @@ private:
class ExtVM: public ExtVMFace class ExtVM: public ExtVMFace
{ {
public: public:
ExtVM(State& _s, Address _myAddress, Address _txSender, u256 _txValue, u256 _gasPrice, bytesConstRef _txData, bytesConstRef _code): ExtVM(State& _s, Address _myAddress, Address _caller, Address _origin, u256 _value, u256 _gasPrice, bytesConstRef _data, bytesConstRef _code):
ExtVMFace(_myAddress, _txSender, _txValue, _gasPrice, _txData, _code, _s.m_previousBlock, _s.m_currentBlock, _s.m_currentNumber), m_s(_s), m_origCache(_s.m_cache) ExtVMFace(_myAddress, _caller, _origin, _value, _gasPrice, _data, _code, _s.m_previousBlock, _s.m_currentBlock, _s.m_currentNumber), m_s(_s), m_origCache(_s.m_cache)
{ {
m_s.ensureCached(_myAddress, true, true); m_s.ensureCached(_myAddress, true, true);
m_store = &(m_s.m_cache[_myAddress].memory()); m_store = &(m_s.m_cache[_myAddress].memory());
@ -278,12 +277,12 @@ public:
// Increment associated nonce for sender. // Increment associated nonce for sender.
m_s.noteSending(myAddress); m_s.noteSending(myAddress);
return m_s.create(myAddress, _endowment, gasPrice, _gas, _code, _init); return m_s.create(myAddress, _endowment, gasPrice, _gas, _code, _init, origin);
} }
bool call(Address _receiveAddress, u256 _txValue, bytesConstRef _txData, u256* _gas, bytesRef _out) bool call(Address _receiveAddress, u256 _txValue, bytesConstRef _txData, u256* _gas, bytesRef _out)
{ {
return m_s.call(_receiveAddress, myAddress, _txValue, gasPrice, _txData, _gas, _out); return m_s.call(_receiveAddress, myAddress, _txValue, gasPrice, _txData, _gas, _out, origin);
} }
u256 balance(Address _a) { return m_s.balance(_a); } u256 balance(Address _a) { return m_s.balance(_a); }

24
libethereum/VM.h

@ -36,14 +36,15 @@ namespace eth
// Currently we just pull out the right (low-order in BE) 160-bits. // Currently we just pull out the right (low-order in BE) 160-bits.
inline Address asAddress(u256 _item) inline Address asAddress(u256 _item)
{ {
return left160(h256(_item)); return right160(h256(_item));
} }
inline u256 fromAddress(Address _a) inline u256 fromAddress(Address _a)
{ {
h256 ret; return (u160)_a;
memcpy(&ret, &_a, sizeof(_a)); // h256 ret;
return ret; // memcpy(&ret, &_a, sizeof(_a));
// return ret;
} }
/** /**
@ -300,8 +301,7 @@ template <class Ext> eth::bytesConstRef eth::VM::go(Ext& _ext, uint64_t _steps)
m_stack.push_back(fromAddress(_ext.myAddress)); m_stack.push_back(fromAddress(_ext.myAddress));
break; break;
case Instruction::ORIGIN: case Instruction::ORIGIN:
// TODO get originator from ext. m_stack.push_back(fromAddress(_ext.origin));
m_stack.push_back(fromAddress(_ext.txSender));
break; break;
case Instruction::BALANCE: case Instruction::BALANCE:
{ {
@ -310,27 +310,27 @@ template <class Ext> eth::bytesConstRef eth::VM::go(Ext& _ext, uint64_t _steps)
break; break;
} }
case Instruction::CALLER: case Instruction::CALLER:
m_stack.push_back(fromAddress(_ext.txSender)); m_stack.push_back(fromAddress(_ext.caller));
break; break;
case Instruction::CALLVALUE: case Instruction::CALLVALUE:
m_stack.push_back(_ext.txValue); m_stack.push_back(_ext.value);
break; break;
case Instruction::CALLDATALOAD: case Instruction::CALLDATALOAD:
{ {
require(1); require(1);
if ((unsigned)m_stack.back() + 32 < _ext.txData.size()) if ((unsigned)m_stack.back() + 32 < _ext.data.size())
m_stack.back() = (u256)*(h256 const*)(_ext.txData.data() + (unsigned)m_stack.back()); m_stack.back() = (u256)*(h256 const*)(_ext.data.data() + (unsigned)m_stack.back());
else else
{ {
h256 r; h256 r;
for (unsigned i = (unsigned)m_stack.back(), e = (unsigned)m_stack.back() + 32, j = 0; i < e; ++i, ++j) for (unsigned i = (unsigned)m_stack.back(), e = (unsigned)m_stack.back() + 32, j = 0; i < e; ++i, ++j)
r[j] = i < _ext.txData.size() ? _ext.txData[i] : 0; r[j] = i < _ext.data.size() ? _ext.data[i] : 0;
m_stack.back() = (u256)r; m_stack.back() = (u256)r;
} }
break; break;
} }
case Instruction::CALLDATASIZE: case Instruction::CALLDATASIZE:
m_stack.push_back(_ext.txData.size()); m_stack.push_back(_ext.data.size());
break; break;
case Instruction::GASPRICE: case Instruction::GASPRICE:
m_stack.push_back(_ext.gasPrice); m_stack.push_back(_ext.gasPrice);

32
test/vm.cpp

@ -40,7 +40,7 @@ public:
FakeExtVM() FakeExtVM()
{} {}
FakeExtVM(BlockInfo const& _previousBlock, BlockInfo const& _currentBlock, uint _currentNumber): FakeExtVM(BlockInfo const& _previousBlock, BlockInfo const& _currentBlock, uint _currentNumber):
ExtVMFace(Address(), Address(), 0, 1, bytesConstRef(), bytesConstRef(), _previousBlock, _currentBlock, _currentNumber) ExtVMFace(Address(), Address(), Address(), 0, 1, bytesConstRef(), bytesConstRef(), _previousBlock, _currentBlock, _currentNumber)
{} {}
u256 store(u256 _n) u256 store(u256 _n)
@ -81,24 +81,24 @@ public:
return right160(t.sha3(false)); return right160(t.sha3(false));
} }
bool call(Address _receiveAddress, u256 _txValue, bytesConstRef _txData, u256* _gas, bytesRef _txOut) bool call(Address _receiveAddress, u256 _value, bytesConstRef _data, u256* _gas, bytesRef _out)
{ {
Transaction t; Transaction t;
t.value = _txValue; t.value = _value;
t.gasPrice = gasPrice; t.gasPrice = gasPrice;
t.gas = *_gas; t.gas = *_gas;
t.data = _txData.toVector(); t.data = _data.toVector();
t.receiveAddress = _receiveAddress; t.receiveAddress = _receiveAddress;
txs.push_back(t); txs.push_back(t);
(void)_txOut; (void)_out;
return true; return true;
} }
void setTransaction(Address _txSender, u256 _txValue, u256 _gasPrice, bytes const& _txData) void setTransaction(Address _caller, u256 _value, u256 _gasPrice, bytes const& _data)
{ {
txSender = _txSender; caller = origin = _caller;
txValue = _txValue; value = _value;
txData = &_txData; data = &_data;
gasPrice = _gasPrice; gasPrice = _gasPrice;
} }
void setContract(Address _myAddress, u256 _myBalance, u256 _myNonce, bytes const& _code, map<u256, u256> const& _storage) void setContract(Address _myAddress, u256 _myBalance, u256 _myNonce, bytes const& _code, map<u256, u256> const& _storage)
@ -251,11 +251,12 @@ public:
{ {
mObject ret; mObject ret;
ret["address"] = toString(myAddress); ret["address"] = toString(myAddress);
ret["sender"] = toString(txSender); ret["caller"] = toString(caller);
push(ret, "value", txValue); ret["origin"] = toString(origin);
push(ret, "value", value);
push(ret, "gasPrice", gasPrice); push(ret, "gasPrice", gasPrice);
mArray d; mArray d;
for (auto const& i: txData) for (auto const& i: data)
push(d, i); push(d, i);
ret["data"] = d; ret["data"] = d;
return ret; return ret;
@ -264,13 +265,14 @@ public:
void importExec(mObject& _o) void importExec(mObject& _o)
{ {
myAddress = Address(_o["address"].get_str()); myAddress = Address(_o["address"].get_str());
txSender = Address(_o["sender"].get_str()); caller = Address(_o["caller"].get_str());
txValue = toInt(_o["value"]); origin = Address(_o["origin"].get_str());
value = toInt(_o["value"]);
gasPrice = toInt(_o["gasPrice"]); gasPrice = toInt(_o["gasPrice"]);
thisTxData.clear(); thisTxData.clear();
for (auto const& j: _o["data"].get_array()) for (auto const& j: _o["data"].get_array())
thisTxData.push_back(toByte(j)); thisTxData.push_back(toByte(j));
txData = &thisTxData; data = &thisTxData;
} }
mArray exportTxs() mArray exportTxs()

4
walleth/MainWin.cpp

@ -176,12 +176,12 @@ unsigned QEthereum::peerCount() const
void QEthereum::transact(Secret _secret, u256 _amount, u256 _gasPrice, u256 _gas, QByteArray _code, QByteArray _init) void QEthereum::transact(Secret _secret, u256 _amount, u256 _gasPrice, u256 _gas, QByteArray _code, QByteArray _init)
{ {
client()->transact(_secret, _amount, _gasPrice, _gas, bytes(_code.data(), _code.data() + _code.size()), bytes(_init.data(), _init.data() + _init.size())); client()->transact(_secret, _amount, bytes(_code.data(), _code.data() + _code.size()), bytes(_init.data(), _init.data() + _init.size()), _gas, _gasPrice);
} }
void QEthereum::transact(Secret _secret, Address _dest, u256 _amount, u256 _gasPrice, u256 _gas, QByteArray _data) void QEthereum::transact(Secret _secret, Address _dest, u256 _amount, u256 _gasPrice, u256 _gas, QByteArray _data)
{ {
client()->transact(_secret, _amount, _gasPrice, _gas, _dest, bytes(_data.data(), _data.data() + _data.size())); client()->transact(_secret, _amount, _dest, bytes(_data.data(), _data.data() + _data.size()), _gas, _gasPrice);
} }
Main::Main(QWidget *parent) : Main::Main(QWidget *parent) :

Loading…
Cancel
Save