int stateTest() { KeyPair me = sha3("Gav Wood"); KeyPair myMiner = sha3("Gav's Miner"); // KeyPair you = sha3("123"); Defaults::setDBPath("/tmp"); Overlay stateDB = State::openDB(); BlockChain bc; State s(myMiner.address(), stateDB); cout << bc; // Sync up - this won't do much until we use the last state. s.sync(bc); cout << s; // Mine to get some ether! s.commitToMine(bc); while (s.mine(100).completed) {} bc.attemptImport(s.blockData(), stateDB); cout << bc; s.sync(bc); cout << s; // Inject a transaction to transfer funds from miner to me. bytes tx; { Transaction t; t.nonce = s.transactionsFrom(myMiner.address()); t.value = 1000; // 1e3 wei. t.receiveAddress = me.address(); t.sign(myMiner.secret()); assert(t.sender() == myMiner.address()); tx = t.rlp(); } s.execute(tx); cout << s; // Mine to get some ether and set in stone. s.commitToMine(bc); while (s.mine(100).completed) {} bc.attemptImport(s.blockData(), stateDB); cout << bc; s.sync(bc); cout << s; return 0; }
int main() { cnote << "Testing State..."; KeyPair me = sha3("Gav Wood"); KeyPair myMiner = sha3("Gav's Miner"); // KeyPair you = sha3("123"); Defaults::setDBPath(boost::filesystem::temp_directory_path().string() + "/" + toString(chrono::system_clock::now().time_since_epoch().count())); OverlayDB stateDB = State::openDB(); CanonBlockChain bc; cout << bc; State s(stateDB, BaseState::CanonGenesis, myMiner.address()); cout << s; // Sync up - this won't do much until we use the last state. s.sync(bc); cout << s; // Mine to get some ether! mine(s, bc); bc.attemptImport(s.blockData(), stateDB); cout << bc; s.sync(bc); cout << s; // Inject a transaction to transfer funds from miner to me. Transaction t(1000, 10000, 30000, me.address(), bytes(), s.transactionsFrom(myMiner.address()), myMiner.secret()); assert(t.sender() == myMiner.address()); s.execute(bc.lastHashes(), t); cout << s; // Mine to get some ether and set in stone. s.commitToMine(bc); s.commitToMine(bc); mine(s, bc); bc.attemptImport(s.blockData(), stateDB); cout << bc; s.sync(bc); cout << s; return 0; }
KeyPair KeyManager::presaleSecret(std::string const& _json, function<string(bool)> const& _password) { js::mValue val; json_spirit::read_string(_json, val); auto obj = val.get_obj(); string p = _password(true); if (obj["encseed"].type() == js::str_type) { auto encseed = fromHex(obj["encseed"].get_str()); KeyPair k; for (bool gotit = false; !gotit;) { gotit = true; k = KeyPair::fromEncryptedSeed(&encseed, p); if (obj["ethaddr"].type() == js::str_type) { Address a(obj["ethaddr"].get_str()); Address b = k.address(); if (a != b) { if ((p = _password(false)).empty()) BOOST_THROW_EXCEPTION(PasswordUnknown()); else gotit = false; } } } return k; } else BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("encseed type is not js::str_type")); }
void MixClient::resetState(std::map<Secret, u256> _accounts, Secret _miner) { WriteGuard l(x_state); Guard fl(x_filtersWatches); m_filters.clear(); m_watches.clear(); m_stateDB = OverlayDB(); SecureTrieDB<Address, MemoryDB> accountState(&m_stateDB); accountState.init(); m_userAccounts.clear(); std::map<Address, Account> genesisState; for (auto account: _accounts) { KeyPair a = KeyPair(account.first); m_userAccounts.push_back(a); genesisState.insert(std::make_pair(a.address(), Account(account.second, Account::NormalCreation))); } dev::eth::commit(genesisState, static_cast<MemoryDB&>(m_stateDB), accountState); h256 stateRoot = accountState.root(); m_bc.reset(); m_bc.reset(new MixBlockChain(m_dbPath, stateRoot)); m_state = eth::State(m_stateDB, BaseState::PreExisting, KeyPair(_miner).address()); m_state.sync(bc()); m_startState = m_state; WriteGuard lx(x_executions); m_executions.clear(); }
int main() { KeyPair u = KeyPair::create(); KeyPair cb = KeyPair::create(); OverlayDB db; State s(cb.address(), db, BaseState::Empty); cnote << s.rootHash(); s.addBalance(u.address(), 1 * ether); Address c = s.newContract(1000 * ether, compileLLL("(suicide (caller))")); s.commit(); State before = s; cnote << "State before transaction: " << before; Transaction t(0, 10000, 10000, c, bytes(), 0, u.secret()); cnote << "Transaction: " << t; cnote << s.balance(c); s.execute(LastHashes(), t.rlp()); cnote << "State after transaction: " << s; cnote << before.diff(s); }
int main() { string tempDir = boost::filesystem::temp_directory_path().string() + "/" + toString(chrono::system_clock::now().time_since_epoch().count()); KeyPair myMiner = sha3("Gav's Miner"); p2p::Host net("Test"); cdebug << "Path:" << tempDir; Client c(&net, tempDir); c.setAddress(myMiner.address()); this_thread::sleep_for(chrono::milliseconds(1000)); c.startMining(); this_thread::sleep_for(chrono::milliseconds(6000)); c.stopMining(); return 0; }
bool AccountManager::execute(int argc, char** argv) { if (string(argv[1]) == "wallet") { if (3 < argc && string(argv[2]) == "import") { if (!openWallet()) return false; string file = argv[3]; string name = "presale wallet"; string pw; KeyPair k; try { k = m_keyManager->presaleSecret( contentsString(file), [&](bool){ return (pw = getPassword("Enter the passphrase for the presale key: "));} ); } catch (Exception const& _e) { if (auto err = boost::get_error_info<errinfo_comment>(_e)) cout << " Decryption failed: " << *err << endl; else cout << " Decryption failed: Unknown reason." << endl; return false; } m_keyManager->import(k.secret(), name, pw, "Same passphrase as used for presale key"); cout << " Address: {" << k.address().hex() << "}" << endl; } else streamWalletHelp(cout); return true; } else if (string(argv[1]) == "account") { if (argc < 3 || string(argv[2]) == "list") { openWallet(); if (m_keyManager->store().keys().empty()) cout << "No keys found." << endl; else { vector<u128> bare; AddressHash got; int k = 0; for (auto const& u: m_keyManager->store().keys()) { if (Address a = m_keyManager->address(u)) { got.insert(a); cout << "Account #" << k << ": {" << a.hex() << "}" << endl; k++; } else bare.push_back(u); } for (auto const& a: m_keyManager->accounts()) if (!got.count(a)) { cout << "Account #" << k << ": {" << a.hex() << "}" << " (Brain)" << endl; k++; } for (auto const& u: bare) { cout << "Account #" << k << ": " << toUUID(u) << " (Bare)" << endl; k++; } } } else if (2 < argc && string(argv[2]) == "new") { openWallet(); string name; string lock; string lockHint; lock = createPassword("Enter a passphrase with which to secure this account:"); auto k = makeKey(); h128 u = m_keyManager->import(k.secret(), name, lock, lockHint); cout << "Created key " << toUUID(u) << endl; cout << " ICAP: " << ICAP(k.address()).encoded() << endl; cout << " Address: {" << k.address().hex() << "}" << endl; } else if (3 < argc && string(argv[2]) == "import") { openWallet(); h128 u = m_keyManager->store().importKey(argv[3]); if (!u) { cerr << "Error: reading key file failed" << endl; return false; } string pw; bytesSec s = m_keyManager->store().secret(u, [&](){ return (pw = getPassword("Enter the passphrase for the key: ")); }); if (s.empty()) { cerr << "Error: couldn't decode key or invalid secret size." << endl; return false; } else { string lockHint; string name; m_keyManager->importExisting(u, name, pw, lockHint); auto a = m_keyManager->address(u); cout << "Imported key " << toUUID(u) << endl; cout << " ICAP: " << ICAP(a).encoded() << endl; cout << " Address: {" << a.hex() << "}" << endl; } } else if (3 < argc && string(argv[2]) == "update") { openWallet(); for (int k = 3; k < argc; k++) { string i = argv[k]; h128 u = fromUUID(i); if (isHex(i) || u != h128()) { string newP = createPassword("Enter the new passphrase for the account " + i); auto oldP = [&](){ return getPassword("Enter the current passphrase for the account " + i + ": "); }; bool recoded = false; if (isHex(i)) { recoded = m_keyManager->store().recode( Address(i), newP, oldP, dev::KDF::Scrypt ); } else if (u != h128()) { recoded = m_keyManager->store().recode( u, newP, oldP, dev::KDF::Scrypt ); } if (recoded) cerr << "Re-encoded " << i << endl; else cerr << "Couldn't re-encode " << i << "; key does not exist, corrupt or incorrect passphrase supplied." << endl; } else cerr << "Couldn't re-encode " << i << "; does not represent an address or uuid." << endl; } } else streamAccountHelp(cout); return true; } else return false; }
void Main::on_create_clicked() { KeyPair p = KeyPair::create(); QString s = QString::fromStdString("The new secret key is:\n" + asHex(p.secret().asArray()) + "\n\nAddress:\n" + asHex(p.address().asArray())); QMessageBox::information(this, "Create Key", s, QMessageBox::Ok); }
int main(int argc, char** argv) { unsigned short listenPort = 30303; string remoteHost; unsigned short remotePort = 30303; string dbPath; bool mining = false; unsigned peers = 5; #if ETH_JSONRPC int jsonrpc = 8080; #endif string publicIP; bool upnp = true; string clientName; // Init defaults Defaults::get(); // Our address. KeyPair us = KeyPair::create(); Address coinbase = us.address(); string configFile = getDataDir() + "/config.rlp"; bytes b = contents(configFile); if (b.size()) { RLP config(b); us = KeyPair(config[0].toHash<Secret>()); coinbase = config[1].toHash<Address>(); } else { RLPStream config(2); config << us.secret() << coinbase; writeFile(configFile, config.out()); } for (int i = 1; i < argc; ++i) { string arg = argv[i]; if ((arg == "-l" || arg == "--listen" || arg == "--listen-port") && i + 1 < argc) listenPort = (short)atoi(argv[++i]); else if ((arg == "-u" || arg == "--public-ip" || arg == "--public") && i + 1 < argc) publicIP = argv[++i]; else if ((arg == "-r" || arg == "--remote") && i + 1 < argc) remoteHost = argv[++i]; else if ((arg == "-p" || arg == "--port") && i + 1 < argc) remotePort = (short)atoi(argv[++i]); else if ((arg == "-n" || arg == "--upnp") && i + 1 < argc) { string m = argv[++i]; if (isTrue(m)) upnp = true; else if (isFalse(m)) upnp = false; else { cerr << "Invalid UPnP option: " << m << endl; return -1; } } else if ((arg == "-c" || arg == "--client-name") && i + 1 < argc) clientName = argv[++i]; else if ((arg == "-a" || arg == "--address" || arg == "--coinbase-address") && i + 1 < argc) coinbase = h160(fromHex(argv[++i])); else if ((arg == "-s" || arg == "--secret") && i + 1 < argc) us = KeyPair(h256(fromHex(argv[++i]))); else if ((arg == "-d" || arg == "--path" || arg == "--db-path") && i + 1 < argc) dbPath = argv[++i]; else if ((arg == "-m" || arg == "--mining") && i + 1 < argc) { string m = argv[++i]; if (isTrue(m)) mining = true; else if (isFalse(m)) mining = false; else { cerr << "Unknown mining option: " << m << endl; } } #if ETH_JSONRPC else if ((arg == "-j" || arg == "--json-rpc")) jsonrpc = jsonrpc ? jsonrpc : 8080; else if (arg == "--json-rpc-port" && i + 1 < argc) jsonrpc = atoi(argv[++i]); #endif else if ((arg == "-v" || arg == "--verbosity") && i + 1 < argc) g_logVerbosity = atoi(argv[++i]); else if ((arg == "-x" || arg == "--peers") && i + 1 < argc) peers = atoi(argv[++i]); else if (arg == "-h" || arg == "--help") help(); else if (arg == "-V" || arg == "--version") version(); else remoteHost = argv[i]; } if (!clientName.empty()) clientName += "/"; WebThreeDirect web3("NEthereum(++)/" + clientName + "v" + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), dbPath); Client& c = *web3.ethereum(); c.setForceMining(true); cout << credits(); std::ostringstream ccout; // Initialize ncurses char* str = new char[255]; int width; int height; int y = 0; int x = 2; string cmd; WINDOW * mainwin, * consolewin, * logwin, * blockswin, * pendingwin, *addswin, * contractswin, * peerswin; if (!(mainwin = initscr())) { cerr << "Error initialising ncurses."; return -1; } getmaxyx(mainwin, height, width); int qheight = height * 3 / 5; int qwidth = width / 4 - 4; nonl(); cbreak(); timeout(30000); echo(); keypad(mainwin, true); // Initialize color pairs start_color(); init_pair(1, COLOR_WHITE, COLOR_BLACK); init_pair(2, COLOR_RED, COLOR_BLACK); init_pair(3, 7, COLOR_BLACK); use_default_colors(); logwin = newwin(height * 2 / 5 - 2, width * 2 / 3, qheight, 0); nc::nc_window_streambuf outbuf(logwin, std::cout); consolewin = newwin(qheight, width / 4, 0, 0); nc::nc_window_streambuf coutbuf(consolewin, ccout); blockswin = newwin(qheight, width / 4, 0, width / 4); pendingwin = newwin(height * 1 / 5, width / 4, 0, width * 2 / 4); peerswin = newwin(height * 2 / 5, width / 4, height * 1 / 5, width * 2 / 4); addswin = newwin(height * 2 / 5 - 2, width / 3, qheight, width * 2 / 3); contractswin = newwin(qheight, width / 4, 0, width * 3 / 4); int vl = qheight - 4; wsetscrreg(consolewin, 1, vl); wsetscrreg(blockswin, 1, vl); wsetscrreg(pendingwin, 1, vl); wsetscrreg(peerswin, 1, vl); wsetscrreg(addswin, 1, vl); wsetscrreg(contractswin, 1, vl); mvwprintw(mainwin, 1, 1, " > "); wresize(mainwin, 3, width); mvwin(mainwin, height - 3, 0); wmove(mainwin, 1, 4); if (!remoteHost.empty()) { web3.setIdealPeerCount(peers); web3.setNetworkPreferences(NetworkPreferences(listenPort, publicIP, upnp)); web3.startNetwork(); web3.connect(remoteHost, remotePort); } if (mining) c.startMining(); #if ETH_JSONRPC auto_ptr<EthStubServer> jsonrpcServer; if (jsonrpc > -1) { jsonrpcServer = auto_ptr<EthStubServer>(new EthStubServer(new jsonrpc::HttpServer(jsonrpc), web3)); jsonrpcServer->setKeys({us}); jsonrpcServer->StartListening(); } #endif while (true) { wclrtobot(consolewin); wclrtobot(pendingwin); wclrtobot(peerswin); wclrtobot(addswin); wclrtobot(contractswin); ccout << credits(); // Prompt wmove(mainwin, 1, 4); getstr(str); string s(str); istringstream iss(s); iss >> cmd; // Address ccout << "Address:" << endl; ccout << toHex(us.address().asArray()) << endl << endl; mvwprintw(mainwin, 1, 1, " > "); clrtoeol(); if (s.length() > 1) { ccout << "> "; ccout << str << endl; } if (cmd == "netstart") { unsigned port; iss >> port; web3.setNetworkPreferences(NetworkPreferences((short)port, publicIP, upnp)); web3.startNetwork(); } else if (cmd == "connect")
int main(int argc, char** argv) { short listenPort = 30303; string remoteHost; short remotePort = 30303; bool interactive = false; string dbPath; eth::uint mining = ~(eth::uint)0; NodeMode mode = NodeMode::Full; unsigned peers = 5; string publicIP; bool upnp = true; string clientName; // Init defaults Defaults::get(); // Our address. KeyPair us = KeyPair::create(); Address coinbase = us.address(); string configFile = getDataDir() + "/config.rlp"; bytes b = contents(configFile); if (b.size()) { RLP config(b); us = KeyPair(config[0].toHash<Secret>()); coinbase = config[1].toHash<Address>(); } else { RLPStream config(2); config << us.secret() << coinbase; writeFile(configFile, config.out()); } for (int i = 1; i < argc; ++i) { string arg = argv[i]; if ((arg == "-l" || arg == "--listen" || arg == "--listen-port") && i + 1 < argc) listenPort = atoi(argv[++i]); else if ((arg == "-u" || arg == "--public-ip" || arg == "--public") && i + 1 < argc) publicIP = argv[++i]; else if ((arg == "-r" || arg == "--remote") && i + 1 < argc) remoteHost = argv[++i]; else if ((arg == "-p" || arg == "--port") && i + 1 < argc) remotePort = atoi(argv[++i]); else if ((arg == "-n" || arg == "--upnp") && i + 1 < argc) { string m = argv[++i]; if (isTrue(m)) upnp = true; else if (isFalse(m)) upnp = false; else { cerr << "Invalid UPnP option: " << m << endl; return -1; } } else if ((arg == "-c" || arg == "--client-name") && i + 1 < argc) clientName = argv[++i]; else if ((arg == "-a" || arg == "--address" || arg == "--coinbase-address") && i + 1 < argc) coinbase = h160(fromUserHex(argv[++i])); else if ((arg == "-s" || arg == "--secret") && i + 1 < argc) us = KeyPair(h256(fromUserHex(argv[++i]))); else if (arg == "-i" || arg == "--interactive") interactive = true; else if ((arg == "-d" || arg == "--path" || arg == "--db-path") && i + 1 < argc) dbPath = argv[++i]; else if ((arg == "-m" || arg == "--mining") && i + 1 < argc) { string m = argv[++i]; if (isTrue(m)) mining = ~(eth::uint)0; else if (isFalse(m)) mining = 0; else if (int i = stoi(m)) mining = i; else { cerr << "Unknown mining option: " << m << endl; return -1; } } else if ((arg == "-v" || arg == "--verbosity") && i + 1 < argc) g_logVerbosity = atoi(argv[++i]); else if ((arg == "-x" || arg == "--peers") && i + 1 < argc) peers = atoi(argv[++i]); else if ((arg == "-o" || arg == "--mode") && i + 1 < argc) { string m = argv[++i]; if (m == "full") mode = NodeMode::Full; else if (m == "peer") mode = NodeMode::PeerServer; else { cerr << "Unknown mode: " << m << endl; return -1; } } else if (arg == "-h" || arg == "--help") help(); else if (arg == "-V" || arg == "--version") version(); else remoteHost = argv[i]; } if (!clientName.empty()) clientName += "/"; Client c("Ethereum(++)/" + clientName + "v" ADD_QUOTES(ETH_VERSION) "/" ADD_QUOTES(ETH_BUILD_TYPE) "/" ADD_QUOTES(ETH_BUILD_PLATFORM), coinbase, dbPath); if (interactive) { cout << "Ethereum (++)" << endl; cout << " Code by Gav Wood, (c) 2013, 2014." << endl; cout << " Based on a design by Vitalik Buterin." << endl << endl; while (true) { cout << "> " << flush; std::string cmd; cin >> cmd; if (cmd == "netstart") { eth::uint port; cin >> port; c.startNetwork(port); } else if (cmd == "connect") { string addr; eth::uint port; cin >> addr >> port; c.connect(addr, port); }