public void ShouldSignHash() { var address1 = "0x6A849e2036A36EB4Cd37b9aFA3c770064899f1A2"; var address2 = "0x12890D2cce102216644c59daE5baed380d84830c"; var numberBytes = new IntTypeEncoder().Encode(1); //Number is a big integer so we need 32 bytes if it was int32 it will be 4 bytes. Using the abi encoder it takes care of padding var sha3 = new Util.Sha3Keccack(); var output = sha3.CalculateHashFromHex(address1, address2, numberBytes.ToHex()); Assert.Equal("0xc11d3d2b8e0c5b8b645b9e7502751352ecaf8c3fdf3a0124dae9c1556fb2ce37", output.EnsureHexPrefix()); var signer = new MessageSigner(); var signature = signer.Sign(output.HexToByteArray(), "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7"); var ethEcdsa = MessageSigner.ExtractEcdsaSignature(signature); var adddress = signer.EcRecover(output.HexToByteArray(), signature); Assert.Equal(adddress, new EthECKey("0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7".HexToByteArray(), true).GetPublicAddress()); }
static void Main(string[] args) { KeyVaultClient kvc = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetToken)); var signer = new AzureKeyVaultExternalSigner(kvc, URI); var publicKey = signer.GetPublicKeyAsync().Result; System.Console.WriteLine(publicKey.ToHex()); var msgHash = new Util.Sha3Keccack().CalculateHash("Hello").HexToByteArray(); var ethExternalSigner = new EthECKeyExternalSigner(signer); var signature = ethExternalSigner.SignAndCalculateVAsync(msgHash).Result; var publicKeyRecovered = EthECKey.RecoverFromSignature(signature, msgHash); System.Console.WriteLine(publicKeyRecovered.GetPubKey().ToHex()); var transfer = new TransferFunction(); transfer.To = "0x1996a57077877D38e18A1BE44A55100D77b8fA1D"; transfer.FromAddress = publicKeyRecovered.GetPublicAddress(); transfer.Value = 1; transfer.Nonce = 1; transfer.GasPrice = 100; transfer.Gas = 1000; var rpcClient = new RpcClient(new Uri("http://localhost:8545")); var transactionInput = transfer.CreateTransactionInput("0x12890d2cce102216644c59daE5baed380d84830c"); var externalAccount = new ExternalAccount(ethExternalSigner, 1); externalAccount.InitialiseAsync().Wait(); externalAccount.InitialiseDefaultTransactionManager(rpcClient); var signature2 = externalAccount.TransactionManager.SignTransactionAsync(transactionInput).Result; var transactionSigner = new TransactionSigner(); var publicKeyRecovered2 = transactionSigner.GetPublicKey(signature2, 1); System.Console.WriteLine(publicKeyRecovered2.ToHex()); System.Console.ReadLine(); }
static void Main(string[] args) { //var credential = new DefaultAzureCredential( // new DefaultAzureCredentialOptions // { // //VisualStudioTenantId = TENANT_ID, // //VisualStudioCodeTenantId = TENANT_ID, // }); var credential = new ClientSecretCredential(TENANT_ID, APP_ID, APP_PASSWORD); var signer = new AzureKeyVaultExternalSigner(KEY_NAME, URI, credential); var address = signer.GetAddressAsync().Result; System.Console.WriteLine(address); var msgHash = new Util.Sha3Keccack().CalculateHash("Hello").HexToByteArray(); var signature = signer.SignAsync(msgHash).Result; var publicKeyRecovered = EthECKey.RecoverFromSignature(signature, msgHash); System.Console.WriteLine(publicKeyRecovered.GetPubKey().ToHex()); var transfer = new TransferFunction(); transfer.To = "0x1996a57077877D38e18A1BE44A55100D77b8fA1D"; transfer.FromAddress = publicKeyRecovered.GetPublicAddress(); transfer.Value = 1; transfer.Nonce = 1; transfer.GasPrice = 100; transfer.Gas = 1000; var rpcClient = new RpcClient(new Uri("http://localhost:8545")); var transactionInput = transfer.CreateTransactionInput("0x12890d2cce102216644c59daE5baed380d84830c"); var externalAccount = new ExternalAccount(signer, 1); externalAccount.InitialiseAsync().Wait(); externalAccount.InitialiseDefaultTransactionManager(rpcClient); var signature2 = externalAccount.TransactionManager.SignTransactionAsync(transactionInput).Result; var publicKeyRecovered2 = TransactionVerificationAndRecovery.GetPublicKey(signature2); var transactionFromSignature = TransactionFactory.CreateTransaction(signature2); System.Console.WriteLine("Recovered public key"); System.Console.WriteLine(publicKeyRecovered2.ToHex()); System.Console.WriteLine("Recovered transaction Type"); System.Console.WriteLine(transactionFromSignature.TransactionType.ToString()); System.Console.WriteLine("Signing EIP1559"); var transferEip1559 = new TransferFunction(); transferEip1559.To = "0x1996a57077877D38e18A1BE44A55100D77b8fA1D"; transferEip1559.FromAddress = publicKeyRecovered.GetPublicAddress(); transferEip1559.Value = 1; transferEip1559.Nonce = 1; transferEip1559.MaxFeePerGas = 1000; transferEip1559.MaxPriorityFeePerGas = 999; transferEip1559.Gas = 1000; var transactionInputEip1559 = transferEip1559.CreateTransactionInput("0x12890d2cce102216644c59daE5baed380d84830c"); var signature3 = externalAccount.TransactionManager.SignTransactionAsync(transactionInputEip1559).Result; var publicKeyRecovered3 = TransactionVerificationAndRecovery.GetPublicKey(signature3); var transactionFromSignatureEIP1559 = TransactionFactory.CreateTransaction(signature3); System.Console.WriteLine("Recovered public key"); System.Console.WriteLine(publicKeyRecovered3.ToHex()); System.Console.WriteLine("Recovered transaction Type"); System.Console.WriteLine(transactionFromSignatureEIP1559.TransactionType.ToString()); System.Console.ReadLine(); }