Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
c5ebd50
Add GetRandom With ranges to stdlib
cschuchardt88 May 31, 2025
68cea76
GetRandom only does min and max value with BigInteger, no limits
cschuchardt88 Jun 7, 2025
4327f69
Merge `dev` into `this`
cschuchardt88 Jun 19, 2025
92d641c
Changed for @roman-khimov
cschuchardt88 Jun 19, 2025
7779416
Added @roman-khimov feedback
cschuchardt88 Jun 21, 2025
c960401
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Jun 21, 2025
8125030
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Jun 21, 2025
889b467
Made fixes to `GetRandom(maxValue)` for the calulation.
cschuchardt88 Jun 26, 2025
9a0de40
Merge branch 'dev' into add/random-ranage-contract
Wi1l-B0t Jun 28, 2025
f6bb2ce
Fixed the method for `GetRandom(MaxValue)`
cschuchardt88 Jul 8, 2025
c4a2381
Fixed to be `A 32-bit signed integer that is greater than or equal to…
cschuchardt88 Jul 8, 2025
97646c0
A 32-bit signed integer that is greater than or equal to 0 and less t…
cschuchardt88 Jul 8, 2025
ec31953
fixed tests
cschuchardt88 Jul 8, 2025
b7007df
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Jul 8, 2025
231c36f
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Jul 14, 2025
e251a4e
Fixed `GetRandom` for faster resolve.
cschuchardt88 Jul 14, 2025
75304f4
Merge branch 'add/random-ranage-contract' of github.com:cschuchardt88…
cschuchardt88 Jul 14, 2025
aa42a91
Fixed unit test
cschuchardt88 Jul 14, 2025
456453f
Merge branch 'dev' into add/random-ranage-contract
Jul 14, 2025
b93b007
Merge branch 'dev' into add/random-ranage-contract
vncoelho Jul 15, 2025
0d81431
Made better fast return
cschuchardt88 Jul 29, 2025
b3222c8
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Jul 29, 2025
9d3cf99
Update src/Neo/SmartContract/Native/StdLib.cs
shargon Jul 30, 2025
e27cc9f
Merge branch 'dev' into add/random-ranage-contract
shargon Jul 30, 2025
1890a24
Fix UT
shargon Jul 31, 2025
495bf4b
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Jul 31, 2025
6327298
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Aug 3, 2025
699412b
Update src/Neo/SmartContract/Native/StdLib.cs
cschuchardt88 Aug 3, 2025
a9b3f57
Merge branch 'dev' into add/random-ranage-contract
shargon Aug 4, 2025
6123bce
Merge branch 'dev' into add/random-ranage-contract
Wi1l-B0t Aug 4, 2025
087e2e3
Update src/Neo/SmartContract/Native/StdLib.cs
shargon Aug 4, 2025
684ef49
Update src/Neo/SmartContract/Native/StdLib.cs
cschuchardt88 Aug 5, 2025
5b81136
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Aug 5, 2025
ba407a4
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Aug 5, 2025
536240f
Merge branch 'dev' into add/random-ranage-contract
NGDAdmin Aug 11, 2025
93b9147
Merge branch 'dev' into add/random-ranage-contract
Wi1l-B0t Aug 11, 2025
d0ef022
Merge branch 'dev' into add/random-ranage-contract
NGDAdmin Aug 12, 2025
23c6644
Fixed `GetRandom`
cschuchardt88 Aug 22, 2025
4055de0
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Aug 22, 2025
10d3eea
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Aug 29, 2025
892a19b
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Aug 30, 2025
530bae9
Merge Changes
cschuchardt88 Sep 1, 2025
239ac48
Fixed unit test
cschuchardt88 Sep 1, 2025
62565d2
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Sep 4, 2025
cd46b38
Changed `GetRandom` system call to use 256-bits integers
cschuchardt88 Sep 6, 2025
71421be
Fixed GetRandom syscall tests
cschuchardt88 Sep 6, 2025
7f11329
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Sep 8, 2025
fe1da8a
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Sep 8, 2025
8defdea
made srand function for syscall `GetRandom`
cschuchardt88 Sep 9, 2025
16ef3e4
Merge branch 'add/random-ranage-contract' of github.com:cschuchardt88…
cschuchardt88 Sep 9, 2025
578440f
Removed unused code and fix `GetRandom` syscall
cschuchardt88 Sep 9, 2025
7680004
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Sep 10, 2025
67d9824
fixed the spread of the numbers
cschuchardt88 Sep 10, 2025
0663753
Merge branch 'add/random-ranage-contract' of github.com:cschuchardt88…
cschuchardt88 Sep 10, 2025
97bdd7d
Merge branch 'dev' into add/random-ranage-contract
shargon Sep 11, 2025
67da3d2
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Sep 11, 2025
c479b79
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Sep 15, 2025
bbc1dc5
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Sep 17, 2025
f80ac48
fixed remainder
cschuchardt88 Sep 20, 2025
f57cd44
optimized
cschuchardt88 Sep 21, 2025
a8328c7
fixed bug
cschuchardt88 Sep 21, 2025
09ba018
bug
cschuchardt88 Sep 21, 2025
19fea5d
bug fix
cschuchardt88 Sep 22, 2025
cc5dfd2
fixed a problem
cschuchardt88 Sep 23, 2025
61fc499
LowPart maxvalue fixed
cschuchardt88 Sep 23, 2025
6cec193
made function dynamic
cschuchardt88 Sep 23, 2025
20ebbfd
removed a un-needed line
cschuchardt88 Sep 23, 2025
8db7e47
Fix unit tests and `GetRandom`
cschuchardt88 Sep 25, 2025
5dfd971
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Sep 25, 2025
104d719
Fixed syntax
cschuchardt88 Sep 27, 2025
3399f33
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Oct 2, 2025
b7b652e
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Oct 5, 2025
8fe7543
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Oct 6, 2025
beaa95c
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Oct 11, 2025
aa34316
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Oct 13, 2025
accbf12
Merge branch 'dev' into add/random-ranage-contract
cschuchardt88 Nov 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions src/Neo/SmartContract/Native/StdLib.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,5 +263,55 @@ private static int StrLen([MaxLength(MaxInputLength)] string str)

return count;
}

[ContractMethod(CpuFee = 1 << 10)]
public static ulong GetRandom(ApplicationEngine engine, ulong minValue, ulong maxValue)
{
if (minValue > maxValue)
throw new ArgumentOutOfRangeException(nameof(minValue));

return GetRandom(engine, maxValue - minValue) + minValue;
}

[ContractMethod(CpuFee = 1 << 10)]
private static ulong GetRandom(ApplicationEngine engine, ulong maxValue)
{
var randomProduct = BigMul(maxValue, (ulong)(engine.GetRandom() & ulong.MaxValue), out var lowPart);

if (lowPart < maxValue)
{
var remainder = (0ul - maxValue) % maxValue;

while (lowPart < remainder)
{
randomProduct = BigMul(maxValue, (ulong)(engine.GetRandom() & ulong.MaxValue), out lowPart);
}
}

return randomProduct;

static ulong BigMul(ulong a, ulong b, out ulong low)
{
// Adaptation of algorithm for multiplication
// of 32-bit unsigned integers described
// in Hacker's Delight by Henry S. Warren, Jr. (ISBN 0-201-91465-4), Chapter 8
// Basically, it's an optimized version of FOIL method applied to
// low and high dwords of each operand

// Use 32-bit uints to optimize the fallback for 32-bit platforms.
var al = (uint)a;
var ah = (uint)(a >> 32);
var bl = (uint)b;
var bh = (uint)(b >> 32);

var mull = ((ulong)al) * bl;
var t = ((ulong)ah) * bl + (mull >> 32);
var tl = ((ulong)al) * bh + (uint)t;

low = tl << 32 | (uint)mull;

return ((ulong)ah) * bh + (t >> 32) + (tl >> 32);
}
}
}
}
22 changes: 22 additions & 0 deletions tests/Neo.UnitTests/SmartContract/Native/UT_StdLib.cs
Original file line number Diff line number Diff line change
Expand Up @@ -427,5 +427,27 @@ public void TestBase64Url()
Assert.AreEqual("U3ViamVjdD10ZXN0QGV4YW1wbGUuY29tJklzc3Vlcj1odHRwczovL2V4YW1wbGUuY29t", engine.ResultStack.Pop<ByteString>().GetString());
}
}

[TestMethod]
public void TestGetRandomRanges()
{
var snapshotCache = TestBlockchain.GetTestSnapshotCache();
using (var script = new ScriptBuilder())
{
// Test encoding
script.EmitDynamicCall(NativeContract.StdLib.Hash, "getRandom", 1);
script.EmitDynamicCall(NativeContract.StdLib.Hash, "getRandom", 1_00000000, 1_00000000);
script.EmitDynamicCall(NativeContract.StdLib.Hash, "getRandom", 100_000_000_000_00000000, 100_000_000_000_00000000);

using var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshotCache, settings: TestProtocolSettings.Default);
engine.LoadScript(script.ToArray());

Assert.AreEqual(engine.Execute(), VMState.HALT);
Assert.AreEqual(3, engine.ResultStack.Count);
Assert.AreEqual(100_000_000_000_00000000, engine.ResultStack.Pop<Integer>());
Assert.AreEqual(1_00000000, engine.ResultStack.Pop<Integer>());
Assert.AreEqual(0_00000000, engine.ResultStack.Pop<Integer>());
}
}
}
}
Loading