每一笔交易都需要由帐户发送和签署。该帐户需要验证(签名),以便认证他们的以太帐户持有人或确认他希望与智能合约交互。
要发送一个交易,你要么管理你的帐户,并在本地签署原生交易,要么帐户将由客户端(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
或以上版本时,可以直接加载文件:
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"&