每一笔交易都需要由帐户发送和签署。该帐户需要验证(签名),以便认证他们的以太帐户持有人或确认他希望与智能合约交互。
要发送一个交易,你要么管理你的帐户,并在本地签署原生交易,要么帐户将由客户端(Parity/Geth)管理,在发送交易时,在发送一个交易或手动解锁帐户之前,需要发送密码时。
在Nethereum.Web3
中,为了简化过程,可以使用两种类型的帐户。Account
对象或ManagedAccount
对象。它们都存储发送交易、私钥或密码所需的帐户信息。
在发送交易时,将选择传递交易的正确方法。如果使用TransactionManager
、部署合约或使用合约函数,则交易将使用私钥离线签名,或者将使用密码发送personal_sendTransaction
消息。
使用私钥生成帐户,你可以生成新的私钥并使用Web3存储定义(与所有客户端兼容)来存储它,或者从任何存储中加载现有的密钥,或者从本地安装的客户端的密钥存储文件夹加载。
除了安全性之外的一个主要优点(避免在纯文本中传输口令)是,你不需要本地安装客户端,允许你使用像Infura这样的公共节点。
加密的帐户密钥存储文件中可以找到不同的位置,这取决于客户端和操作系统:
当使用net451
或以上版本时,可以直接加载文件:
var password = "password";
var accountFilePath = @"c:\xxx\UTC--2015-11-25T05-05-03.116905600Z--12890d2cce102216644c59dae5baed380d84830c";
var account = Account.LoadFromKeyStoreFile(accountFilePath, string password);
如果你正在选择其他核心框架,例如.net core或netstandard,则不支持直接从文件中加载,为了主要的平台兼容性,在这种情况下,你需要提取json fist并将其作为参数传递。
var password = "password";
var keyStoreEncryptedJson =
@"{""crypto"":{""cipher"":""aes-128-ctr"",""ciphertext"":""b4f42e48903879b16239cd5508bc5278e5d3e02307deccbec25b3f5638b85f91"",""cipherparams"":{""iv"":""dc3f37d304047997aa4ef85f044feb45""},""kdf"":""scrypt"",""mac"":""ada930e08702b89c852759bac80533bd71fc4c1ef502291e802232b74bd0081a"",""kdfparams"":{""n"":65536,""r"":1,""p"":8,""dklen"":32,""salt"":""2c39648840b3a59903352b20386f8c41d5146ab88627eaed7c0f2cc8d5d95bd4""}},""id"":""19883438-6d67-4ab8-84b9-76a846ce544b"",""address"":""12890d2cce102216644c59dae5baed380d84830c"",""version"":3}";
var account = Nethereum.Web3.Accounts.Account.LoadFromKeyStore(keyStoreEncryptedJson, password);
一旦将私钥加载到帐户中,如果Web3被实例化,则使用TransactionManager
、合约部署或函数所做的所有交易将使用最新的nonce
进行离线签名。
例如,在这种情况下,我们正在从密钥存储文件中创建具有私钥的帐户,并使用默认的http://localhost:8545”创建Web3的新实例。
var password = "password";
var accountFilePath = @"c:\xxx\UTC--2015-11-25T05-05-03.116905600Z--12890d2cce102216644c59dae5baed380d84830c";
var account = Nethereum.Web3.Accounts.Account.LoadFromKeyStoreFile(accountFilePath, string password);
var web3 = new Nethereum.Web3.Web3(account);
现在所有这些类型的交易都会离线签名。
使用交易管理器进行转账将一定数量的代币转移到另一个地址:
await web3.TransactionManager.SendTransactionAsync(account.Address, addressTo, new HexBigInteger(20));
发布一个合约:
web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000),
multiplier)
Make一个合约交易函数:
var multiplyFunction = contract.GetFunction("multiply");
await multiplyFunction.SendTransactionAsync(senderAddress,7);
要创建一个新帐户,只需要生成一个新的私钥,Nethereum.Signer提供了一个使用SecureRandom的方法。帐户对象只接受私钥作为构造函数,以减少与私钥生成的任何耦合,以及生成私钥的规定方式。
var ecKey = Nethereum.Signer.EthECKey.GenerateKey();
var privateKey = ecKey.GetPrivateKeyAsBytes().ToHex();
var account = new Nethereum.Accounts.Account(privateKey);
Nethereum.KeyStore
类库,允许你加密和保存你的私人密钥,以兼容的方式提供给所有客户端。
客户端使用提供密码解密的文件查询帐户私钥(如果存储在密钥库文件夹)。这是当解锁一个帐户,或只是在使用personal_sendTransaction
与密码发送交易的时候。
一个帐户解锁一段时间可能是一个安全问题,所以在这种情况下,优先选择是使用RPC方法personal_sendTransaction
。
Nethereum.Web3
用ManagedAccount
封装这个功能,具有管理存储帐户的地址和密码信息的能力。
var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
var password = "password";
var account = new ManagedAccount(senderAddress, password);
var web3 = new Web3.Web3(account);
当与Web3结合使用时,现在以与“Account”相同的方式,你可以:
使用交易管理器TransactionManager
将一定数量代币转账到另一个地址:
await web3.TransactionManager.SendTransactionAsync(account.Address, addressTo, new HexBigInteger(20));
发布一个合约:
web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000),
multiplier)
Make一个合约交易函数:
var multiplyFunction = contract.GetFunction("multiply");
await multiplyFunction.SendTransactionAsync(senderAddress,7);
如果你希望快速的开始使用.net和C#开发以太坊应用,那这个课程会很有帮助,课程地址如下:
如果是其他语言开发以太坊应用的可以参考以下教程:
汇智网原创,转载请标明出处。这里是原文