public void TestStorage() { var temp = new FileInfo(Path.GetTempFileName()); try { Console.WriteLine(temp.FullName); var networkParams = NetworkParameters.UnitTests(); var to = new EcKey().ToAddress(networkParams); StoredBlock b1; using (var store = new BoundedOverheadBlockStore(networkParams, temp)) { // Check the first block in a new store is the genesis block. var genesis = store.GetChainHead(); Assert.AreEqual(networkParams.GenesisBlock, genesis.Header); // Build a new block. b1 = genesis.Build(genesis.Header.CreateNextBlock(to).CloneAsHeader()); store.Put(b1); store.SetChainHead(b1); } // Check we can get it back out again if we rebuild the store object. using (var store = new BoundedOverheadBlockStore(networkParams, temp)) { var b2 = store.Get(b1.Header.Hash); Assert.AreEqual(b1, b2); // Check the chain head was stored correctly also. Assert.AreEqual(b1, store.GetChainHead()); } } finally { temp.Delete(); } }
public static void Run(string[] args) { var testNet = args.Length > 0 && string.Equals(args[0], "testnet", StringComparison.InvariantCultureIgnoreCase); var networkParams = testNet ? NetworkParameters.TestNet(19000) : NetworkParameters.ProdNet(); var filePrefix = testNet ? "pingservice-testnet" : "pingservice-prodnet"; // Try to read the wallet from storage, create a new one if not possible. Wallet wallet; var walletFile = new FileInfo(filePrefix + ".wallet"); try { wallet = Wallet.LoadFromFile(walletFile); } catch (IOException) { wallet = new Wallet(networkParams); wallet.Keychain.Add(new EcKey()); wallet.SaveToFile(walletFile); } // Fetch the first key in the wallet (should be the only key). var key = wallet.Keychain[0]; Console.WriteLine(wallet); // Load the block chain, if there is one stored locally. Console.WriteLine("Reading block store from disk"); using (var blockStore = new BoundedOverheadBlockStore(networkParams, new FileInfo(filePrefix + ".blockchain"))) { // Connect to the localhost node. One minute timeout since we won't try any other peers Console.WriteLine("Connecting ..."); var chain = new BlockChain(networkParams, wallet, blockStore); var peerGroup = new PeerGroup(blockStore, networkParams, chain); peerGroup.AddAddress(new PeerAddress(IPAddress.Loopback)); peerGroup.Start(); // We want to know when the balance changes. wallet.CoinsReceived += (sender, e) => { // Running on a peer thread. Debug.Assert(!e.NewBalance.Equals(0)); // It's impossible to pick one specific identity that you receive coins from in BitCoin as there // could be inputs from many addresses. So instead we just pick the first and assume they were all // owned by the same person. var input = e.Tx.Inputs[0]; var from = input.FromAddress; var value = e.Tx.GetValueSentToMe(wallet); Console.WriteLine("Received " + Utils.BitcoinValueToFriendlystring(value) + " from " + from); // Now send the coins back! var sendTx = wallet.SendCoins(peerGroup, from, value); Debug.Assert(sendTx != null); // We should never try to send more coins than we have! Console.WriteLine("Sent coins back! Transaction hash is " + sendTx.HashAsString); wallet.SaveToFile(walletFile); }; peerGroup.DownloadBlockChain(); Console.WriteLine("Send coins to: " + key.ToAddress(networkParams)); Console.WriteLine("Waiting for coins to arrive. Press Ctrl-C to quit."); Console.ReadLine(); // The PeerGroup thread keeps us alive until something kills the process. } }