Skip to content

Commit

Permalink
Merge pull request #664 from raistlinthewiz/develop
Browse files Browse the repository at this point in the history
scrypt-n implementation
  • Loading branch information
Hüseyin Uslu committed Oct 28, 2014
2 parents 61b0079 + 6fe2600 commit 0433e47
Show file tree
Hide file tree
Showing 32 changed files with 291 additions and 99 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ Here is a list of our generous donors that keep the project ongoing;

##### Algorithms

* __Scrypt__, __SHA256d__, __X11__, __X13__, X14, X15, X17, Blake, Fresh, Fugue, Groestl, Keccak, NIST5, Scrypt-OG, SHA1, SHAvite3, Skein, Qubit
* __Scrypt__, __SHA256d__, __X11__, __X13__, X14, X15, X17, Blake, Fresh, Fugue, Groestl, Keccak, NIST5, Scrypt-OG, Scrypt-N, SHA1, SHAvite3, Skein, Qubit

##### Protocols

Expand Down
47 changes: 47 additions & 0 deletions contrib/tests/scrypt-n.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// sample implementation: https://github.com/zone117x/node-stratum-pool/blob/master/lib/algoProperties.js#L53

var timeTable = {
hash: function() {

var timeTable = {
"2048": 1389306217,
"4096": 1456415081,
"8192": 1506746729,
"16384": 1557078377,
"32768": 1657741673,
"65536": 1859068265,
"131072": 2060394857,
"262144": 1722307603,
"524288": 1769642992
};

console.log("timeTable");
console.log(timeTable);

var sorted = Object.keys(timeTable).sort();
console.log("sorted");
console.log(sorted);

var reversed = sorted.reverse();
console.log("reversed");
console.log(reversed);

var now = Date.now() / 1000;
console.log("now: " + now);

var filtered = reversed.filter(function(nKey) {
return now > timeTable[nKey];
});
console.log("filtered");
console.log(filtered);

var n = filtered[0];
var nInt = parseInt(n);
console.log("n=" + n);

var nFactor = Math.log(nInt) / Math.log(2);
console.log("nFactor=" + nFactor);
}
};

timeTable.hash();
21 changes: 0 additions & 21 deletions src/CoiniumServ/Algorithms/AlgorithmManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,27 +36,6 @@ namespace CoiniumServ.Algorithms
{
public class AlgorithmManager:IAlgorithmManager
{
public const string Blake = "blake";
public const string Fresh = "fresh";
public const string Fugue = "fugue";
public const string Groestl = "groestl";
public const string Keccak = "keccak";
public const string Nist5 = "nist5";
public const string Qubit = "qubit";
public const string Scrypt = "scrypt";
public const string ScryptOg = "scrypt-og";
public const string Sha1 = "sha1";
public const string Sha256 = "sha256";
public const string Shavite3 = "shavite3";
public const string Skein = "skein";
public const string X11 = "x11";
public const string X13 = "x13";
public const string X14 = "x14";
public const string X15 = "x15";
public const string X17 = "x17";

// todo: add hefty1, qubit support

/// <summary>
/// Global diff1
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,37 @@
//
#endregion

using CoiniumServ.Algorithms;
using CoiniumServ.Algorithms.Implementations;
using CoiniumServ.Container.Context;
using CoiniumServ.Container.Registries;

namespace CoiniumServ.Container.Registries
namespace CoiniumServ.Algorithms
{
public class AlgorithmRegistry : IRegistry
{
// algorithm names
public const string Blake = "blake";
public const string Fresh = "fresh";
public const string Fugue = "fugue";
public const string Groestl = "groestl";
public const string Keccak = "keccak";
public const string Nist5 = "nist5";
public const string Qubit = "qubit";
public const string Scrypt = "scrypt";
public const string ScryptOg = "scrypt-og";
public const string ScryptN = "scrypt-n";
public const string Sha1 = "sha1";
public const string Sha256 = "sha256";
public const string Shavite3 = "shavite3";
public const string Skein = "skein";
public const string X11 = "x11";
public const string X13 = "x13";
public const string X14 = "x14";
public const string X15 = "x15";
public const string X17 = "x17";

// todo: add hefty1, qubit support

private readonly IApplicationContext _applicationContext;

public AlgorithmRegistry(IApplicationContext applicationContext)
Expand All @@ -40,27 +64,34 @@ public void RegisterInstances()
// available cryptographic hash functions: http://en.wikipedia.org/wiki/List_of_hash_functions#Cryptographic_hash_functions

// algorithm manager
_applicationContext.Container.Register<IAlgorithmManager, AlgorithmManager>().AsSingleton();
_applicationContext.Container.Register<IAlgorithmManager, AlgorithmManager>().AsMultiInstance();

// sha variants
_applicationContext.Container.Register<IHashAlgorithm, Sha256>(Sha256).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Sha1>(Sha1).AsMultiInstance();

// scrypt variants
_applicationContext.Container.Register<IHashAlgorithm, Scrypt>(Scrypt).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, ScryptOg>(ScryptOg).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, ScryptN>(ScryptN).AsMultiInstance();

// multi-hashers
_applicationContext.Container.Register<IHashAlgorithm, X11>(X11).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, X13>(X13).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, X14>(X14).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, X15>(X15).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, X17>(X17).AsMultiInstance();

// hash algorithms
_applicationContext.Container.Register<IHashAlgorithm, Blake>(AlgorithmManager.Blake).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Fresh>(AlgorithmManager.Fresh).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Fugue>(AlgorithmManager.Fugue).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Groestl>(AlgorithmManager.Groestl).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Keccak>(AlgorithmManager.Keccak).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Nist5>(AlgorithmManager.Nist5).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Qubit>(AlgorithmManager.Qubit).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Scrypt>(AlgorithmManager.Scrypt).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, ScryptOg>(AlgorithmManager.ScryptOg).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Sha1>(AlgorithmManager.Sha1).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Sha256>(AlgorithmManager.Sha256).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Shavite3>(AlgorithmManager.Shavite3).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, Skein>(AlgorithmManager.Skein).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, X11>(AlgorithmManager.X11).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, X13>(AlgorithmManager.X13).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, X14>(AlgorithmManager.X14).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, X15>(AlgorithmManager.X15).AsSingleton();
_applicationContext.Container.Register<IHashAlgorithm, X17>(AlgorithmManager.X17).AsSingleton();
// misc ones
_applicationContext.Container.Register<IHashAlgorithm, Blake>(Blake).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Fresh>(Fresh).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Fugue>(Fugue).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Groestl>(Groestl).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Keccak>(Keccak).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Nist5>(Nist5).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Qubit>(Qubit).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Shavite3>(Shavite3).AsMultiInstance();
_applicationContext.Container.Register<IHashAlgorithm, Skein>(Skein).AsMultiInstance();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System;
using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Blake : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System.Collections.Generic;
using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Fresh : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System;
using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Fugue : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System;
using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Groestl : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System;
using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Keccak : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System.Collections.Generic;
using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Nist5 : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System.Collections.Generic;
using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Qubit : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System;
using CryptSharp.Utility;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Scrypt : HashAlgorithmBase
{
Expand Down
99 changes: 99 additions & 0 deletions src/CoiniumServ/Algorithms/Implementations/ScryptN.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#region License
//
// CoiniumServ - Crypto Currency Mining Pool Server Software
// Copyright (C) 2013 - 2014, CoiniumServ Project - http://www.coinium.org
// http://www.coiniumserv.com - https://github.com/CoiniumServ/CoiniumServ
//
// This software is dual-licensed: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// For the terms of this license, see licenses/gpl_v3.txt.
//
// Alternatively, you can license this software under a commercial
// license or white-label it as set out in licenses/commercial.txt.
//
#endregion

using System;
using System.Linq;
using System.Collections.Generic;
using CoiniumServ.Coin.Config;
using CoiniumServ.Utils.Helpers;
using CryptSharp.Utility;
using JsonConfig;

namespace CoiniumServ.Algorithms.Implementations
{
public sealed class ScryptN : HashAlgorithmBase
{
/// <summary>
/// R parameter - block size.
/// </summary>
private readonly int _r;

/// <summary>
/// P - parallelization parameter - a large value of p can increase computational
/// cost of scrypt without increasing the memory usage.
/// </summary>
private readonly int _p;

// default time-table for scrypt-n
private readonly Dictionary<Int32, UInt64> _defaultTimeTable = new Dictionary<Int32, UInt64>
{
{2048, 1389306217},
{4096, 1456415081},
{8192, 1506746729},
{16384, 1557078377},
{32768, 1657741673},
{65536, 1859068265},
{131072, 2060394857},
{262144, 1722307603},
{524288, 1769642992},
};

private Dictionary<Int32, UInt64> _timeTable; // timeTable for the coin.

public ScryptN(ICoinConfig coinConfig)
{
_r = 1;
_p = 1;
Multiplier = (UInt32)Math.Pow(2, 16);

InitTimeTable(coinConfig.Extra.timeTable); // init the timeTable for the coin.
}

private void InitTimeTable(dynamic table)
{
_timeTable = new Dictionary<int, ulong>();

if (table is NullExceptionPreventer) // if we are not provided a timeTable
_timeTable = _defaultTimeTable; // use the default table.
else
{
// else use the table provided by the coin configuration within extra.timeTable section.
foreach (KeyValuePair<string, object> pair in table)
{
_timeTable.Add(Int32.Parse(pair.Key), UInt64.Parse(pair.Value.ToString()));
}
}
}

public override byte[] Hash(byte[] input, dynamic config)
{
var now = (UInt64)TimeHelpers.NowInUnixTimestamp();

var index = _timeTable.OrderBy(x => x.Key).First(x => x.Value < now).Key;
var nFactor = (int)(Math.Log(index) / Math.Log(2));
var n = 1 << nFactor;

return SCrypt.ComputeDerivedKey(input, input, n, _r, _p, null, 32);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
using System;
using CryptSharp.Utility;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class ScryptOg : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Sha1 : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

using System.Security.Cryptography;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Sha256:HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Shavite3 : HashAlgorithmBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

using HashLib;

namespace CoiniumServ.Algorithms
namespace CoiniumServ.Algorithms.Implementations
{
public sealed class Skein : HashAlgorithmBase
{
Expand Down

0 comments on commit 0433e47

Please sign in to comment.