C#以太坊类库Nethereum中的Web3账户

每一笔交易都需要由帐户发送和签署。该帐户需要验证(签名),以便认证他们的以太帐户持有人或确认他希望与智能合约交互。

要发送一个交易,你要么管理你的帐户,并在本地签署原生交易,要么帐户将由客户端(Parity/Geth)管理,在发送交易时,在发送一个交易或手动解锁帐户之前,需要发送密码时。

Nethereum.Web3中,为了简化过程,可以使用两种类型的帐户。Account对象或ManagedAccount对象。它们都存储发送交易、私钥或密码所需的帐户信息。

在发送交易时,将选择传递交易的正确方法。如果使用TransactionManager、部署合约或使用合约函数,则交易将使用私钥离线签名,或者将使用密码发送personal_sendTransaction消息。

账户如何使用

使用私钥生成帐户,你可以生成新的私钥并使用Web3存储定义(与所有客户端兼容)来存储它,或者从任何存储中加载现有的密钥,或者从本地安装的客户端的密钥存储文件夹加载。

除了安全性之外的一个主要优点(避免在纯文本中传输口令)是,你不需要本地安装客户端,允许你使用像Infura这样的公共节点。

载入现有帐户

加密的帐户密钥存储文件中可以找到不同的位置,这取决于客户端和操作系统:

  • Geth:
    • Linux: ~/.ethereum/keystore
    • Mac: /Library/Ethereum/keystore *
    • Windows: %APPDATA%/Ethereum
  • Parity:
    • Windows %APPDATA%\Roaming\Parity\Ethereum
    • Mac: /Library/Application Support/io.parity.ethereum *
    • Linux: ~/.local/share/io.parity.ethereum

当使用net451或以上版本时,可以直接加载文件:

1
2
3
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并将其作为参数传递。

1
2
3
4
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中使用帐户

一旦将私钥加载到帐户中,如果Web3被实例化,则使用TransactionManager、合约部署或函数所做的所有交易将使用最新的nonce进行离线签名。

例如,在这种情况下,我们正在从密钥存储文件中创建具有私钥的帐户,并使用默认的http://localhost:8545”创建Web3的新实例。

1
2
3
4
5
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);

现在所有这些类型的交易都会离线签名。

使用交易管理器进行转账将一定数量的代币转移到另一个地址:

1
await web3.TransactionManager.SendTransactionAsync(account.Address, addressTo, new HexBigInteger(20));

发布一个合约:

1
2
web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000),
multiplier)

Make一个合约交易函数:

1
2
var multiplyFunction = contract.GetFunction("multiply");
await multiplyFunction.SendTransactionAsync(senderAddress,7);

创建一个新账户

要创建一个新帐户,只需要生成一个新的私钥,Nethereum.Signer提供了一个使用SecureRandom的方法。帐户对象只接受私钥作为构造函数,以减少与私钥生成的任何耦合,以及生成私钥的规定方式。

1
2
3
var ecKey = Nethereum.Signer.EthECKey.GenerateKey();
var privateKey = ecKey.GetPrivateKeyAsBytes().ToHex();
var account = new Nethereum.Accounts.Account(privateKey);

Nethereum.KeyStore类库,允许你加密和保存你的私人密钥,以兼容的方式提供给所有客户端。

在Web3中使用托管帐户

客户端使用提供密码解密的文件查询帐户私钥(如果存储在密钥库文件夹)。这是当解锁一个帐户,或只是在使用personal_sendTransaction与密码发送交易的时候。

一个帐户解锁一段时间可能是一个安全问题,所以在这种情况下,优先选择是使用RPC方法personal_sendTransaction

Nethereum.Web3ManagedAccount封装这个功能,具有管理存储帐户的地址和密码信息的能力。

1
2
3
4
5
var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
var password = "password";

var account = new ManagedAccount(senderAddress, password);
var web3 = new Web3.Web3(account);

当与Web3结合使用时,现在以与“Account”相同的方式,你可以:

使用交易管理器TransactionManager将一定数量代币转账到另一个地址:

1
await web3.TransactionManager.SendTransactionAsync(account.Address, addressTo, new HexBigInteger(20));

发布一个合约:

1
2
web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000),
multiplier)

Make一个合约交易函数:

1
2
var multiplyFunction = contract.GetFunction("multiply");
await multiplyFunction.SendTransactionAsync(senderAddress,7);

如果你希望快速的开始使用.net和C#开发以太坊应用,那这个课程会很有帮助,课程地址如下:

C#以太坊

如果是其他语言开发以太坊应用的可以参考以下教程:

  • web3j教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

汇智网原创,转载请标明出处。这里是原文