Commit 9efd15c0 authored by Dan Gershony's avatar Dan Gershony

merge

parents 7ea016a3 bb43fb28
...@@ -25,125 +25,126 @@ namespace Breeze.Daemon ...@@ -25,125 +25,126 @@ namespace Breeze.Daemon
{ {
public static void Main(string[] args) public static void Main(string[] args)
{ {
IFullNodeBuilder fullNodeBuilder = null; IFullNodeBuilder fullNodeBuilder = null;
if (args.Contains("stratis")) // configure logging
{ Logs.Configure(Logs.GetLoggerFactory(args));
// configure Full Node
Logs.Configure(Logs.GetLoggerFactory(args)); if (args.Contains("stratis"))
if (NodeSettings.PrintHelp(args, Network.StratisMain)) {
return; if (NodeSettings.PrintHelp(args, Network.StratisMain))
return;
var network = args.Contains("-testnet") ? InitStratisTest() : Network.StratisMain;
var nodeSettings = NodeSettings.FromArguments(args, "stratis", network, ProtocolVersion.ALT_PROTOCOL_VERSION); var network = args.Contains("-testnet") ? InitStratisTest() : Network.StratisMain;
var nodeSettings = NodeSettings.FromArguments(args, "stratis", network, ProtocolVersion.ALT_PROTOCOL_VERSION);
if (args.Contains("light"))
{ if (args.Contains("light"))
fullNodeBuilder = new FullNodeBuilder() {
.UseNodeSettings(nodeSettings) fullNodeBuilder = new FullNodeBuilder()
.UseLightWallet() .UseNodeSettings(nodeSettings)
.UseBlockNotification() .UseLightWallet()
.UseTransactionNotification() .UseBlockNotification()
.UseApi(); .UseTransactionNotification()
} .UseApi();
else }
{ else
fullNodeBuilder = new FullNodeBuilder() {
.UseNodeSettings(nodeSettings) fullNodeBuilder = new FullNodeBuilder()
.UseStratisConsensus() .UseNodeSettings(nodeSettings)
.UseBlockStore() .UseStratisConsensus()
.UseMempool() .UseBlockStore()
.UseWallet() .UseMempool()
.AddPowPosMining() .UseWallet()
.UseApi(); .AddPowPosMining()
} .UseApi();
} }
else }
{ else
NodeSettings nodeSettings = NodeSettings.FromArguments(args); {
NodeSettings nodeSettings = NodeSettings.FromArguments(args);
if (args.Contains("light"))
{ if (args.Contains("light"))
fullNodeBuilder = new FullNodeBuilder() {
.UseNodeSettings(nodeSettings) fullNodeBuilder = new FullNodeBuilder()
.UseLightWallet() .UseNodeSettings(nodeSettings)
.UseBlockNotification() .UseLightWallet()
.UseTransactionNotification() .UseBlockNotification()
.UseApi(); .UseTransactionNotification()
} .UseApi();
else }
{ else
fullNodeBuilder = new FullNodeBuilder() {
.UseNodeSettings(nodeSettings) fullNodeBuilder = new FullNodeBuilder()
.UseConsensus() .UseNodeSettings(nodeSettings)
.UseBlockStore() .UseConsensus()
.UseMempool() .UseBlockStore()
.UseWallet() .UseMempool()
.UseApi(); .UseWallet()
} .UseApi();
} }
}
// add the tumbler's settings
var tumblerAddress = args.SingleOrDefault(arg => arg.StartsWith("-tumbler-uri=")); // add the tumbler's settings
if (!string.IsNullOrEmpty(tumblerAddress)) var tumblerAddress = args.SingleOrDefault(arg => arg.StartsWith("-tumbler-uri="));
{ if (!string.IsNullOrEmpty(tumblerAddress))
tumblerAddress = tumblerAddress.Replace("-tumbler-uri=", string.Empty); {
fullNodeBuilder.UseTumbleBit(new Uri(tumblerAddress)); tumblerAddress = tumblerAddress.Replace("-tumbler-uri=", string.Empty);
} fullNodeBuilder.UseTumbleBit(new Uri(tumblerAddress));
}
var node = fullNodeBuilder.Build();
var node = fullNodeBuilder.Build();
//start Full Node - this will also start the API
node.Run(); //start Full Node - this will also start the API
node.Run();
} }
private static Network InitStratisTest() private static Network InitStratisTest()
{ {
Block.BlockSignature = true; Block.BlockSignature = true;
Transaction.TimeStamp = true; Transaction.TimeStamp = true;
var consensus = Network.StratisMain.Consensus.Clone(); var consensus = Network.StratisMain.Consensus.Clone();
consensus.PowLimit = new Target(uint256.Parse("0000ffff00000000000000000000000000000000000000000000000000000000")); consensus.PowLimit = new Target(uint256.Parse("0000ffff00000000000000000000000000000000000000000000000000000000"));
// The message start string is designed to be unlikely to occur in normal data. // The message start string is designed to be unlikely to occur in normal data.
// The characters are rarely used upper ASCII, not valid as UTF-8, and produce // The characters are rarely used upper ASCII, not valid as UTF-8, and produce
// a large 4-byte int at any alignment. // a large 4-byte int at any alignment.
var pchMessageStart = new byte[4]; var pchMessageStart = new byte[4];
pchMessageStart[0] = 0x71; pchMessageStart[0] = 0x71;
pchMessageStart[1] = 0x31; pchMessageStart[1] = 0x31;
pchMessageStart[2] = 0x21; pchMessageStart[2] = 0x21;
pchMessageStart[3] = 0x11; pchMessageStart[3] = 0x11;
var magic = BitConverter.ToUInt32(pchMessageStart, 0); //0x5223570; var magic = BitConverter.ToUInt32(pchMessageStart, 0); //0x5223570;
var genesis = Network.StratisMain.GetGenesis().Clone(); var genesis = Network.StratisMain.GetGenesis().Clone();
genesis.Header.Time = 1493909211; genesis.Header.Time = 1493909211;
genesis.Header.Nonce = 2433759; genesis.Header.Nonce = 2433759;
genesis.Header.Bits = consensus.PowLimit; genesis.Header.Bits = consensus.PowLimit;
consensus.HashGenesisBlock = genesis.GetHash(); consensus.HashGenesisBlock = genesis.GetHash();
Guard.Assert(consensus.HashGenesisBlock == uint256.Parse("0x00000e246d7b73b88c9ab55f2e5e94d9e22d471def3df5ea448f5576b1d156b9")); Guard.Assert(consensus.HashGenesisBlock == uint256.Parse("0x00000e246d7b73b88c9ab55f2e5e94d9e22d471def3df5ea448f5576b1d156b9"));
var builder = new NetworkBuilder() var builder = new NetworkBuilder()
.SetName("StratisTest") .SetName("StratisTest")
.SetConsensus(consensus) .SetConsensus(consensus)
.SetMagic(magic) .SetMagic(magic)
.SetGenesis(genesis) .SetGenesis(genesis)
.SetPort(26178) .SetPort(26178)
.SetRPCPort(26174) .SetRPCPort(26174)
.SetBase58Bytes(Base58Type.PUBKEY_ADDRESS, new byte[] { (65) }) .SetBase58Bytes(Base58Type.PUBKEY_ADDRESS, new byte[] { (65) })
.SetBase58Bytes(Base58Type.SCRIPT_ADDRESS, new byte[] { (196) }) .SetBase58Bytes(Base58Type.SCRIPT_ADDRESS, new byte[] { (196) })
.SetBase58Bytes(Base58Type.SECRET_KEY, new byte[] { (65 + 128) }) .SetBase58Bytes(Base58Type.SECRET_KEY, new byte[] { (65 + 128) })
.SetBase58Bytes(Base58Type.ENCRYPTED_SECRET_KEY_NO_EC, new byte[] { 0x01, 0x42 }) .SetBase58Bytes(Base58Type.ENCRYPTED_SECRET_KEY_NO_EC, new byte[] { 0x01, 0x42 })
.SetBase58Bytes(Base58Type.ENCRYPTED_SECRET_KEY_EC, new byte[] { 0x01, 0x43 }) .SetBase58Bytes(Base58Type.ENCRYPTED_SECRET_KEY_EC, new byte[] { 0x01, 0x43 })
.SetBase58Bytes(Base58Type.EXT_PUBLIC_KEY, new byte[] { (0x04), (0x88), (0xB2), (0x1E) }) .SetBase58Bytes(Base58Type.EXT_PUBLIC_KEY, new byte[] { (0x04), (0x88), (0xB2), (0x1E) })
.SetBase58Bytes(Base58Type.EXT_SECRET_KEY, new byte[] { (0x04), (0x88), (0xAD), (0xE4) }) .SetBase58Bytes(Base58Type.EXT_SECRET_KEY, new byte[] { (0x04), (0x88), (0xAD), (0xE4) })
.AddDNSSeeds(new[] .AddDNSSeeds(new[]
{ {
new DNSSeedData("stratisplatform.com", "testnode1.stratisplatform.com"), new DNSSeedData("stratisplatform.com", "testnode1.stratisplatform.com"),
}); });
return builder.BuildAndRegister(); return builder.BuildAndRegister();
} }
} }
} }
{ {
"profiles": { "profiles": {
"Breeze.Daemon Main": { "Breeze.Daemon Main": {
"commandName": "Project" "commandName": "Project",
"commandLineArgs": "light"
}, },
"Breeze.Daemon TestNet": { "Breeze.Daemon TestNet": {
"commandName": "Project", "commandName": "Project",
"commandLineArgs": "-testnet -tumbler-uri=http://localhost:5050" "commandLineArgs": "-testnet -tumbler-uri=http://localhost:5050 light -debug"
}, },
"StratisTest": { "StratisTest": {
"commandName": "Project", "commandName": "Project",
"commandLineArgs": "stratis -testnet -datadir=I:\\\\stratistestnet" "commandLineArgs": "stratis -testnet"
} }
} }
} }
\ No newline at end of file
using Stratis.Bitcoin.Builder.Feature; using Stratis.Bitcoin.Builder.Feature;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Stratis.Bitcoin.Builder; using Stratis.Bitcoin.Builder;
using Stratis.Bitcoin.Logging;
using Microsoft.Extensions.Logging;
using Serilog;
using Stratis.Bitcoin.Wallet; using Stratis.Bitcoin.Wallet;
using Stratis.Bitcoin.Wallet.Controllers; using Stratis.Bitcoin.Wallet.Controllers;
...@@ -11,16 +8,16 @@ namespace Breeze.Wallet ...@@ -11,16 +8,16 @@ namespace Breeze.Wallet
{ {
public class LightWalletFeature : FullNodeFeature public class LightWalletFeature : FullNodeFeature
{ {
private readonly LightWalletSyncManager lightWalletSyncManager; private readonly IWalletSyncManager walletSyncManager;
public LightWalletFeature(LightWalletSyncManager lightWalletSyncManager) public LightWalletFeature(IWalletSyncManager walletSyncManager)
{ {
this.lightWalletSyncManager = lightWalletSyncManager; this.walletSyncManager = walletSyncManager;
} }
public override void Start() public override void Start()
{ {
this.lightWalletSyncManager.Initialize(); this.walletSyncManager.Initialize();
} }
public override void Stop() public override void Stop()
...@@ -30,7 +27,7 @@ namespace Breeze.Wallet ...@@ -30,7 +27,7 @@ namespace Breeze.Wallet
} }
public static class LightWalletFeatureExtension public static class LightWalletFeatureExtension
{ {
public static IFullNodeBuilder UseLightWallet(this IFullNodeBuilder fullNodeBuilder) public static IFullNodeBuilder UseLightWallet(this IFullNodeBuilder fullNodeBuilder)
{ {
fullNodeBuilder.ConfigureFeature(features => fullNodeBuilder.ConfigureFeature(features =>
...@@ -40,10 +37,10 @@ namespace Breeze.Wallet ...@@ -40,10 +37,10 @@ namespace Breeze.Wallet
.FeatureServices(services => .FeatureServices(services =>
{ {
services.AddSingleton<IWalletSyncManager, LightWalletSyncManager>(); services.AddSingleton<IWalletSyncManager, LightWalletSyncManager>();
services.AddSingleton<IWalletManager, WalletManager>(); services.AddSingleton<IWalletManager, WalletManager>();
services.AddSingleton<WalletController>(); services.AddSingleton<WalletController>();
}); });
}); });
return fullNodeBuilder; return fullNodeBuilder;
......
...@@ -8,32 +8,46 @@ using Stratis.Bitcoin; ...@@ -8,32 +8,46 @@ using Stratis.Bitcoin;
using Stratis.Bitcoin.Notifications; using Stratis.Bitcoin.Notifications;
using Stratis.Bitcoin.Utilities; using Stratis.Bitcoin.Utilities;
using Stratis.Bitcoin.Wallet; using Stratis.Bitcoin.Wallet;
using Stratis.Bitcoin.Wallet.Notifications;
namespace Breeze.Wallet namespace Breeze.Wallet
{ {
public class LightWalletSyncManager : WalletSyncManager public class LightWalletSyncManager : IWalletSyncManager
{ {
private readonly WalletManager walletManager; private readonly WalletManager walletManager;
private readonly ConcurrentChain chain; private readonly ConcurrentChain chain;
private readonly BlockNotification blockNotification; private readonly BlockNotification blockNotification;
private readonly CoinType coinType; private readonly CoinType coinType;
private readonly ILogger logger; private readonly ILogger logger;
private readonly Signals signals;
public LightWalletSyncManager(ILoggerFactory loggerFactory, IWalletManager walletManager, ConcurrentChain chain, Network network, public LightWalletSyncManager(ILoggerFactory loggerFactory, IWalletManager walletManager, ConcurrentChain chain, Network network,
BlockNotification blockNotification):base(loggerFactory, walletManager, chain, network) BlockNotification blockNotification, Signals signals)// :base(loggerFactory, walletManager, chain, network)
{ {
this.walletManager = walletManager as WalletManager;
this.chain = chain;
this.signals = signals;
this.blockNotification = blockNotification; this.blockNotification = blockNotification;
this.coinType = (CoinType)network.Consensus.CoinType;
this.logger = loggerFactory.CreateLogger(this.GetType().FullName);
} }
/// <inheritdoc /> /// <inheritdoc />
public override void Initialize() public async Task Initialize()
{ {
// get the chain headers. This needs to be up-to-date before we really do anything // get the chain headers. This needs to be up-to-date before we really do anything
this.WaitForChainDownloadAsync().GetAwaiter().GetResult(); await this.WaitForChainDownloadAsync();
// subscribe to receiving blocks and transactions
BlockSubscriber sub = new BlockSubscriber(this.signals.Blocks, new BlockObserver(this.chain, this));
sub.Subscribe();
TransactionSubscriber txSub = new TransactionSubscriber(this.signals.Transactions, new TransactionObserver(this));
txSub.Subscribe();
// start syncing blocks // start syncing blocks
var bestHeightForSyncing = this.FindBestHeightForSyncing(); var bestHeightForSyncing = this.FindBestHeightForSyncing();
this.SyncFrom(bestHeightForSyncing); this.SyncFrom(bestHeightForSyncing);
this.logger.LogInformation($"Tracker initialized. Syncing from {bestHeightForSyncing}.");
} }
private int FindBestHeightForSyncing() private int FindBestHeightForSyncing()
...@@ -75,7 +89,7 @@ namespace Breeze.Wallet ...@@ -75,7 +89,7 @@ namespace Breeze.Wallet
} }
/// <inheritdoc /> /// <inheritdoc />
public override void SyncFrom(DateTime date) public void SyncFrom(DateTime date)
{ {
int blockSyncStart = this.chain.GetHeightAtTime(date); int blockSyncStart = this.chain.GetHeightAtTime(date);
...@@ -84,9 +98,22 @@ namespace Breeze.Wallet ...@@ -84,9 +98,22 @@ namespace Breeze.Wallet
} }
/// <inheritdoc /> /// <inheritdoc />
public override void SyncFrom(int height) public void SyncFrom(int height)
{ {
this.blockNotification.SyncFrom(this.chain.GetBlock(height).HashBlock); this.blockNotification.SyncFrom(this.chain.GetBlock(height).HashBlock);
} }
public void ProcessBlock(Block block)
{
var hash = block.Header.GetHash();
var height = this.chain.GetBlock(hash).Height;
this.walletManager.ProcessBlock(height, block);
}
public void ProcessTransaction(Transaction transaction)
{
this.walletManager.ProcessTransaction(transaction);
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment