internal async Task <string> GetExtrinsicParametersAsync(GenericExtrinsicCall callArguments, Account account, uint tip, uint lifeTime, CancellationToken token) { Method method = GetMethod(callArguments); uint nonce = await System.AccountNextIndexAsync(account.Address, token); Era era; Hash startEra; if (lifeTime == 0) { era = Era.Create(0, 0); startEra = GenesisHash; } else { startEra = await Chain.GetFinalizedHeadAsync(token); Header finalizedHeader = await Chain.GetHeaderAsync(startEra, token); era = Era.Create(lifeTime, finalizedHeader.Number); } var uncheckedExtrinsic = RequestGenerator.SubmitExtrinsic(true, account, method, era, nonce, tip, GenesisHash, startEra); return(Utils.Bytes2HexString(uncheckedExtrinsic.Encode(), Utils.HexStringFormat.PREFIXED)); }
/// <summary> /// Get an unchecked extrinsic. /// </summary> /// <param name="callArguments"></param> /// <param name="account"></param> /// <param name="tip"></param> /// <param name="lifeTime"></param> /// <param name="signed"></param> /// <param name="token"></param> /// <returns></returns> public async Task <UnCheckedExtrinsic> GetExtrinsicParametersAsync(GenericExtrinsicCall callArguments, Account account, uint tip, uint lifeTime, bool signed, CancellationToken token) { var method = GetMethod(callArguments); var nonce = await System.AccountNextIndexAsync(account.Value, token); Era era; Hash startEra; if (lifeTime == 0) { era = Era.Create(0, 0); startEra = GenesisHash; } else { startEra = await Chain.GetFinalizedHeadAsync(token); var finalizedHeader = await Chain.GetHeaderAsync(startEra, token); era = Era.Create(lifeTime, finalizedHeader.Number.Value); } return(RequestGenerator.SubmitExtrinsic(signed, account, method, era, nonce, tip, GenesisHash, startEra, RuntimeVersion)); }
public void EraCreateTest() { var era = Era.Create(12, 15686); Assert.AreEqual(16, era.Period); Assert.AreEqual(6, era.Phase); }
private static void EraTesting() { var t1 = Era.Decode(Utils.HexToByteArray("0x1503")); Console.WriteLine($"NODE: {t1}"); var t2 = Era.Decode(Utils.HexToByteArray("0xD503")); Console.WriteLine($" API: {t2}"); var t3 = Era.Create(64, 15793); Console.WriteLine($" API: {t3}"); ulong currentBlockNumber = (ulong)15689; var lastBit = currentBlockNumber & (ulong)-(long)currentBlockNumber; var nextPowerOf2 = Math.Pow(2, Math.Round(Math.Log(15689, 2))); Console.WriteLine($"currentBlockNumber[{currentBlockNumber}]: {Math.Round(Math.Log(15689, 2))} {nextPowerOf2}"); }
public void BalanceTransferCreateMortalAccountToAliceTest1() { var _runtime = new RuntimeVersion { SpecVersion = 1, TransactionVersion = 1 }; Constants.AddressVersion = 0; // 0x310284278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e007c9777cf14fe0e14e8aef019695043be2fd153a75ff3381f4cc4850755d537b1a9d7920e509ee2e4e1f244dad670dc44ec3fc24388181e6465fdda13d59ae70063001c000400d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d02890700 // sender 5FfBQ3kwXrbdyoqLPvcXRp7ikWydXawpNs2Ceu3WwFdhZ8W4 // recent blocks 15,689 0xf8438a058c66ab33628249459d1f0bc8114c6550d3ddea45351a96cbf2999813 // nonce 7 // receiver 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY // Lifetime 12 //length: 140[2] //signatureVersion: 0x84 //sendPublicKey: 5CxW5DWQDpXi4cpACd62wzbPjbYrx4y67TZEmRXBcvmDTNaM[0x278117FC144C72340F67D0F2316E8386CEFFBF2B2428C9C51FEF7C597F1D426E] //sendPublicKeyType: 0x00 //signature: 0x7C9777CF14FE0E14E8AEF019695043BE2FD153A75FF3381F4CC4850755D537B1A9D7920E509EE2E4E1F244DAD670DC44EC3FC24388181E6465FDDA13D59AE700 //era: 0x6300 //nonce: 7[1] //tip: 0[1] //moduleIndex: 0x0400 //destPublicKey: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY[0xD43593C715FDD31C61141ABD04A99FD6822C8558854CCDE39A5684E7A56DA27D] //amount: 123456[4] var privatKey = Utils.HexToByteArray( "0xf5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e"); var publicKey = Utils.HexToByteArray("0x278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e"); var account = Account.Build(KeyType.Ed25519, privatKey, publicKey); var bytes = new List <byte>(); bytes.AddRange(Utils.GetPublicKeyFrom("5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY")); CompactInteger amount = 123456; bytes.AddRange(amount.Encode()); var method = new Method(0x04, 0x00, bytes.ToArray()); var era = Era.Create(12, 15686); CompactInteger nonce = 7; CompactInteger tip = 0; var genesis = new Hash(); genesis.Create(Utils.HexToByteArray("0x9b443ea9cd42d9c3e0549757d029d28d03800631f9a9abf1d96d0c414b9aded9")); var startEra = new Hash(); startEra.Create( Utils.HexToByteArray( "0x4c4e0d1594e526c2392e7b6306f890fd0705085a5f83f9114caebb369bc1511f")); // FinalizedHead 15686 // mocked signature var signature = Utils.HexToByteArray( "0x7C9777CF14FE0E14E8AEF019695043BE2FD153A75FF3381F4CC4850755D537B1A9D7920E509EE2E4E1F244DAD670DC44EC3FC24388181E6465FDDA13D59AE700"); var uncheckedExtrinsic = new UnCheckedExtrinsic(true, account, method, era, nonce, tip, genesis, startEra); uncheckedExtrinsic.AddPayloadSignature(signature); var balanceTransferNode = "0x310284278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e007c9777cf14fe0e14e8aef019695043be2fd153a75ff3381f4cc4850755d537b1a9d7920e509ee2e4e1f244dad670dc44ec3fc24388181e6465fdda13d59ae70063001c000400d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d02890700"; //var uncheckedExtrinsicStr = Utils.Bytes2HexString(uncheckedExtrinsic.Encode()); Assert.AreEqual(Utils.HexToByteArray(balanceTransferNode), uncheckedExtrinsic.Encode()); var payload = uncheckedExtrinsic.GetPayload(_runtime).Encode(); //var payloadStr = Utils.Bytes2HexString(payload); if (payload.Length > 256) { payload = HashExtension.Blake2(payload, 256); } var simpleSign = Chaos.NaCl.Ed25519.Sign(payload, account.PrivateKey); //var simpleSignStr = Utils.Bytes2HexString(simpleSign); Assert.True(Chaos.NaCl.Ed25519.Verify(simpleSign, payload, publicKey)); Assert.True(Chaos.NaCl.Ed25519.Verify(signature, payload, publicKey)); var extrinsic = RequestGenerator.SubmitExtrinsic(true, account, method, era, nonce, tip, genesis, startEra, _runtime); Assert.True(Chaos.NaCl.Ed25519.Verify(extrinsic.Signature, extrinsic.GetPayload(_runtime).Encode(), publicKey)); Assert.True(Chaos.NaCl.Ed25519.Verify(signature, extrinsic.GetPayload(_runtime).Encode(), publicKey)); }
public void CreateMogwaiTestZurich() { // 792,193 ---> 0x0cf64c1e0e45b2fba6fd524e180737f5e1bb46e0691783d6963b2e26253f8592 var runtime = new RuntimeVersion { SpecVersion = 1, TransactionVersion = 1 }; Constants.AddressVersion = 1; var accountZurich = Account.Build( KeyType.Ed25519, Utils.HexToByteArray( "0xf5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e"), Utils.GetPublicKeyFrom("5CxW5DWQDpXi4cpACd62wzbPjbYrx4y67TZEmRXBcvmDTNaM")); var privatKey = Utils.HexToByteArray( "0xf5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e"); var publicKey = Utils.HexToByteArray("0x278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e"); // 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e // 029d6a4d204108ecc3d27ccfb5163c85582f946282ba7625c0c9da2595ba89856df529efea6fdc36426a6be89bddefed52d23fc1ccf66dd9483b542ed96e0b08 var referenceExtrinsic = "0xa50184ff278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e00029d6a4d204108ecc3d27ccfb5163c85582f946282ba7625c0c9da2595ba89856df529efea6fdc36426a6be89bddefed52d23fc1ccf66dd9483b542ed96e0b08750304002003"; // "0xA50184FF278117FC144C72340F67D0F2316E8386CEFFBF2B2428C9C51FEF7C597F1D426E00029D6A4D204108ECC3D27CCFB5163C85582F946282BA7625C0C9DA2595BA89856DF529EFEA6FDC36426A6BE89BDDEFED52D23FC1CCF66DD9483B542ED96E0B08750304003203" var method = new Method(0x20, 0x03); var era = Era.Create(64, 792183); CompactInteger nonce = 7; CompactInteger tip = 0; var genesis = new Hash(); genesis.Create(Utils.HexToByteArray("0x778c4bb53621114939206c9c9874c5fa1da38d2e14293d053a0b8dd6125b4042")); var startEra = new Hash(); startEra.Create(Utils.HexToByteArray("0x1a62fe1013aab94901e7dd80051f8e2b6b3c44bd0f0c934ff665768d459b3aa5")); var uncheckedExtrinsic = new UnCheckedExtrinsic(true , Account.Build(KeyType.Ed25519, privatKey, publicKey) , method , era , 1 , 0 , genesis , startEra // currentblock ); uncheckedExtrinsic.AddPayloadSignature(Utils.HexToByteArray( "0x029d6a4d204108ecc3d27ccfb5163c85582f946282ba7625c0c9da2595ba89856df529efea6fdc36426a6be89bddefed52d23fc1ccf66dd9483b542ed96e0b08")); var uncheckedExtrinsicStr = Utils.Bytes2HexString(uncheckedExtrinsic.Encode()); var payload = uncheckedExtrinsic.GetPayload(runtime).Encode(); /// Payloads longer than 256 bytes are going to be `blake2_256`-hashed. if (payload.Length > 256) { payload = HashExtension.Blake2(payload, 256); } byte[] signature; signature = Chaos.NaCl.Ed25519.Sign(payload, privatKey); var signatureStr = Utils.Bytes2HexString(signature); uncheckedExtrinsic.AddPayloadSignature(signature); Assert.AreEqual(referenceExtrinsic, uncheckedExtrinsicStr.ToLower()); /** * * { * isSigned: true, * method: { * args: [], * method: createMogwai, * section: dotMogModule * }, * era: { * MortalEra: { * period: 64, * phase: 55 * } * }, * nonce: 1, * signature: 0x029d6a4d204108ecc3d27ccfb5163c85582f946282ba7625c0c9da2595ba89856df529efea6fdc36426a6be89bddefed52d23fc1ccf66dd9483b542ed96e0b08, * signer: 5CxW5DWQDpXi4cpACd62wzbPjbYrx4y67TZEmRXBcvmDTNaM, * tip: 0 * } * */ //{ // "Signed": true, // "TransactionVersion": 4, // "Account": { // "KeyType": 0, // "Address": "5CxW5DWQDpXi4cpACd62wzbPjbYrx4y67TZEmRXBcvmDTNaM", // "PublicKey": "J4EX/BRMcjQPZ9DyMW6Dhs7/vyskKMnFH+98WX8dQm4=" // }, // "Era": { // "IsImmortal": false, // "Period": 64, // "Phase": 55 // }, // "Nonce": { // "Value": 1 // }, // "Tip": { // "Value": 0 // }, // "Method": { // "ModuleName": "DotMogModule", // "ModuleIndex": 32, // "CallName": "create_mogwai", // "CallIndex": 3, // "Arguments": [ // ], // "Parameters": "" // }, // "Signature": "Ap1qTSBBCOzD0nzPtRY8hVgvlGKCunYlwMnaJZW6iYVt9Snv6m/cNkJqa+ib3e/tUtI/wcz2bdlIO1Qu2W4LCA==" // } }