账户管理

账户

账户在以太坊中扮演核心角色,以太坊包含两种类型的账户:外部账户(EOAs)和合约账户。在这里我们关注于外部账户,也就是我们通常理解的账户,合约账户讲涉及到合约的概念我们在 discussed in detail in Contracts 章节中进行讨论。将外部账户和合约账户都归类于通常都账户概念是合理的,因为他们都属于状态对象。这些实体都包含一个状态:外部对象包含余额状态,合约账户包含余额和合约存储。所有账户的状态,都是通过以太坊网络的每一个块一起达成共识来更新的,账户通过交易和以太坊区块链进行交互对于用户来说是至关重要的。

如果我们限制只有外部帐号之间可以进行交易,那么我们就得到一个没有比特币强大的“代币”系统,仅仅只能进行以太币转移的系统。

账户是外部实体的代理(例如:自然人、矿工节点或自动化代理),账户使用公钥对交易进行加密所以EVM可以确保交易发起者安全有效。

加密文件 (Keyfiles)

每个账户都是由一对钥匙组成:公钥和私钥。账户以它的地址作为索引,地址通过公钥末尾的20字节生成。每一个私钥/地址对都被编码为keyfile。Keyfiles是可以被文字编辑器进行编辑的明文JSON格式,文件中的关键组件:密钥,始终是被加密的,它被用你创建账户时输入的那个密码所加密。Keyfiles杯保存在你以太坊节点的子目录 keystore 中。请确保经常备份你的keyfiles!更多关于备份的信息,请查阅: 备份和恢复帐号

创建钥匙等同于创建一个账户。

  • 你无需告诉任何人你做了它
  • 你无需和区块链进行同步
  • 你无需运行一个客户端
  • 你甚至无需连接到网络上

当然,你的新账户中不会包含一点以太币,但是它是属于你的,可以确定的是没有你的钥匙和密码,任何人都不能访问它。

在以太坊节点间转移整个目录或者单独的keyfile是安全的。

Warning

注意如果你从别的节点拿到的keyfile,添加到当前的节点下,当前的账户顺序有可能发生改变,所以请确保你的脚本或者代码段中没有依赖账户顺序的情况,如果有请记得修改索引号。

创建账户

Warning

请确保一定记住你输入的密码并且备份好你的keyfiles。 如果想从一个账户发起交易,包括发送以太币,你必须同时拥有keyfile和密码,请明确确认你拥有keyfile的拷贝和对应的密码,将它们存储的尽可能的安全,因为你没有后路。如果你丢失了keyfile或者忘记了对应的密码,那么你就丢失了账户中所有的以太币。不可能在没有密码的情况下访问你的账户,并且没有类似于密码找回这样的操作。请永远牢记!

使用 geth account new

一旦你安装过geth客户端,创建账户仅仅需要在终端执行一个命令: geth account new

注意,你无需启动geth客户端,也无需使用命令``geth account``来同步区块链。

$ geth account new

  Your new account is locked with a password. Please give a password. Do not forget this password.
  Passphrase:
  Repeat Passphrase:
  Address: {168bc315a2ee09042d83d7c5811b533620531f67}

你可以使用参数 --password 通过非交互的方式并提供一个明文密码文件来创建账户,文件中包含密码的字节序列后跟一个换行符。

$ geth --password /path/to/password account new

Warning

使用选项 --password 意味着你在测试网络,或者非常信任当前的环境。把密码放入到文件中或其他途径中是非常错误的方式。如果你确定要使用参数 --password ,那么请确保文件不被除你之外的任何人读取。你可以在Mac/Linux系统下使用如下命令:

touch /path/to/password
chmod 600 /path/to/password
cat > /path/to/password
>I type my pass

可以使用 geth account 命令的字命令 list 来列举出当前 keystore 目录下的所有keyfile文件中包含的账户:

$ geth account list

account #0: {a94f5374fce5edbc8e2a8697c15331677e6ebf0b}
account #1: {c385233b188811c9f355d4caec14df86d6248235}
account #2: {7f444580bfef4b9bc7e14eb7fb2a029336b07c9d}

Keyfiles文件的命名格式为: UTC--<created_at UTC ISO8601>-<address hex> 。账户被list命令列举出来时使用的是地址的字典顺序,但是keyfile存放时实际上是按照创建时间排序的。

使用geth命令行

为了使用geth来创建一个新账户,首先需要启动geth命令行模式(或者你可以使用 geth attach 把命令行附加到已经运行的实例上):

> geth console 2>> file_to_log_output
instance: Geth/v1.4.0-unstable/linux/go1.5.1
coinbase: coinbase: [object Object]
at block: 865174 (Mon, 18 Jan 2016 02:58:53 GMT)
datadir: /home/USERNAME/.ethereum

命令行允许你通过事件命令来和本地节点进行交互,例如:试着使用命令列出你的账户:

> eth.accounts

{
code: -32000,
message: "no keys in store"
}

这个显示结果表示你还没有账户,接下来你可以通过命令创建一个:

> personal.newAccount()
Passphrase:
Repeat passphrase:
"0xb2f69ddf70297958e582a0cc98bce43294f1007d"

Note

请确保使用一个随机且强壮的密码

刚刚我们创建了我们的第一个帐号,此时再一次尝试列举出当前节点的账户,我们可以看到新创建的账户:

> eth.accounts
["0xb2f69ddf70297958e582a0cc98bce43294f1007d"]

使用以太坊Mist钱包

为了规避命令行,我们可以使用基于界面的帐号创建方式:以太坊“官方”钱包Mist。它是由以太坊基金会主持的名为Mist项目的产物,所以加上了“官方”这个标记。现在由多种版本的应用,可以运行在Linux、Max OS X和Windows平台。

Warning

Mist是一个试用版本的软件,请自行承担相应的风险。

使用以太坊Mist来创建账户是不能再简单的事情了,事实上,你的第一个账户在你安装应用的时候已经被创建了。

  1. 根据你的操作系统 下载最新版本的钱包应用 。运行钱包后会自动同步以太坊区块链到你的计算机上,之后你实际上会运行一个完整的以太坊节点。
  2. 解压下载的文件到目录,然后执行以太坊钱包。
downloading-mist
  1. 等待全部的区块链被同步,接下来按照屏幕的指引,你会创建你的第一个账户。
  2. 当你第一次启动以太坊Mist,你会看见你的账户在安装过程中被创建,默认的名字是: MAIN ACCOUNT (ETHERBASE).
opening-screen
  1. 继续创建账户也很容易,只需要点击应用界面的:ADD ACCOUNT 并且输入密码。

Note

Mist钱包仍然在开发过程中,所以上面的步骤可能会有变化。

在Mist中实现多重签名的钱包

以太坊Mist钱包可以通过操作实现多重签名让你的钱包更安全,实现多重签名的好处在于你如果要从一个账户提取大量资金,那么就需要多重认证来实现。在实现多重签名之前,你至少要创建2个或2个以上的账户。

在Mist中创建账户是非常简单的,在”Accounts“区域点击”Add Account“,输入一个容易记忆的密码(请记住账户没有密码找回的操作),再次确认密码,这样一个帐号就创建完毕。至少创建2个帐号,第二个帐号你可以在另一台计算机上创建(理论上这样可以让你的账户安全性更高),创建多重签名时你只需要第二个帐号的公钥(也就是帐号地址)。主帐号应该在你准备创建多重签名的客户端上,因为要通过住帐号创建多重签名合约。

现在你已经完成帐号创建的准备工作,确保它们安全并备份它们(如果你的系统坏掉了,而你又没有备份帐号,那么你就永远失去它们了),点击菜单栏中的“Backup”(备份),选择“keystore”目录,进行“copy”(复制)操作,不要选择“cut”(剪切),然后在桌面上进行“paste”(粘贴)操作。你可能想对keystore进行重命名操作,比如改成:“Ethereum-keystore-backup-year-month-day”,这样以后看到它就能快速认出它。完事后就可以把文件夹压缩成zip/rar格式(甚至可以在压缩过程中添加密码),把压缩后的文件保存在U盘中、烧录到CD/DVD中或者上传到在线存储服务中(Dropbox、GoogleDrive等)。

你需要往主账号(即将创建多重签名的钱包)中放入不少于0.02ETH(0.02个以太币),这个作为创建多重签名钱包的交易费,另外需要再放入至少1ETH,因为Mist确保合约正常执行需要足够的“gas”(如果不明白一些概念,请查阅文档的“术语”章节),所以开始前你的主帐号中至少需要1.02ETH。

你需要把附属帐号的地址进行拷贝,之后需要使用到,我们建议你使用拷贝/粘贴操作把地址放到文本编辑器中(notepad、kedit等),在Mist账户的详细信息界面中,选择地址右侧的“copy address”按钮进行拷贝操作。永远不要尝试手动输入地址,手动输入出错的风险极高,一旦出错那么你就会把资金发送到错误的地址上。

现在,我们准备开始创建多重签名钱包。在“Wallet Contracts”下方,选择“Add Wallet Contract”,输入一个名字,选择 主帐号作为拥有者,并且选择“Multisignature Wallet Contract”,你将看到类似下面的信息:

“This is a joint account controlled by X owners. You can send up to Y ether per day. Any transaction over that daily limit requires the confirmation of Z owners.”(翻译过来就是:这是一个由帐号X控制的联合账户,X帐号每天最多可以支出Y以太币,如果交易超过限制那么需要用户Z进行确认。)

设置附加到多重签名的帐号数量,设置你想要的每日限额(少于限额不需要启动多重验证),设置超过限额需要多少人进行同意操作的人员数量。

现在把之前拷贝到文本编辑器中的附属账户地址,重新拷贝/粘贴到一个新的文本文件中,并命名为:Ethereum-Wallet-Address.txt,或者其他你想要的名字。

现在要做的就是把新创建的文件“Ethereum-Wallet-Address.txt”也按照前面备份帐号的方法进行备份,以后提取以太币的时候需要用到这些地址。

如果你想从备份中恢复帐号,那么只需要把备份的压缩包解压所,然后重命名为“keystore”覆盖到先前的目录中。如果恢复多重签名钱包,你需要从菜单中选择“Import Wallet”选项。

问题解决:

  • Mist不能进行同步,一个解决方法就是通过网络时间协议(Network Time Protocol)来同步你计算机的系统时间,然后重启。
  • Mist在同步完后启动,但是窗口显示为空,有可能是你的显卡运行在Linux的操作系统上(Ubunt、Linux Mint等),并且使用“xorg”显卡驱动,请尝试安装显卡厂商自带的驱动后再次运行。
  • “Wrong password” 提示,这个提示是当前版本Mist的一个错误,请重新启动Mist这个问题应该就解决了(如果你的密码确实输入正确)。

使用Eth

每一个eth可以使用的key管理命令都可以同样的方式用在geth上。

下面是“account“相关的命令:

> eth account list  // List all keys available in wallet.
> eth account new   // Create a new key and add it to the wallet.
> eth account update [<uuid>|<address> , ... ]  // Decrypt and re-encrypt given keys.
> eth account import [<uuid>|<file>|<secret-hex>] // Import keys from given source and place in wallet.

下面是 “wallet” 相关的命令:

> eth wallet import <file> //Import a presale wallet.

Note

‘account import’ 操作只能用于通常的keyfile,’wallet import’ 操作只能用于倒入预售的钱包文件。

这些管理命令也可以用在命令台中(使用内置命令台或者geth附加命令台):

> web3.personal
{
      listAccounts: [],
      getListAccounts: function(callback),
      lockAccount: function(),
      newAccount: function(),
      unlockAccount: function()
}

使用EthKey(弃用)

Ethkey是一个C++实现的命令行工具,可以实现和以太坊钱包的交互。你可以列举、检查、创建、删除和修改账户,也可以检查、创建和签名交易。

我们假定你还没有运行任何客户端,如果你已经有可以运行的客户端,那么刻意跳过这个章节。创建钱包,使用如下命令:

> ethkey createwallet

请输入一个主密码来保护你的私钥(不要使用简单密码)。这被称为“主”密码,它会成为加密你私钥的默认密码,你需要重新输入一次以确认密码输入无误。

Note

使用强壮的随记生成密码。

我们可以简单的使用如下命令来列出钱包里面的帐号:

> ethkey list

No keys found.

我们还没有创建过任何帐号,所以显示为空!我们来创建一个。

要创建一个帐号,我们使用 new 命令,我么要提供一个名字,这个名字就是我们即将创建的账户名称,我们使用”test“:

> ethkey new test

输入一个密码来保护新创建的账号(或者不输入使用默认的主密码),如果你不输入密码直接按回车,那么就会使用前一步我们设置的主密码作为新帐号的密码,这意味着以后使用这个帐号时无需输入密码(会使用记录的主密码)。通常情况下,为每个帐号建立一个新的密码是比较好的做法。但是可以为了方便,可以牺牲一些安全性去使用默认密码。

在这个例子中,我们使用一个简单的密码123(永远不要正式环境下使用这样简单的密码)。一旦你输入完毕,系统会要求你再次输入刚才的密码,我们再次输入123。因为你重新设置了一个密码,系统会让你提供一个密码提示信息,这个信息会在你需要输入密码时显示出来。提示信息被存储在钱包中,并被主密码进行保护。输入提示信息:321倒序。

> ethkey new test

Enter a passphrase with which to secure this account (or nothing to use the master passphrase):
Please confirm the passphrase by entering it again:
Enter a hint to help you remember this passphrase: 321 backwards
Created key 055dde03-47ff-dded-8950-0fe39b1fa101
  Name: test
  Password hint: 321 backwards
  ICAP: XE472EVKU3CGMJF2YQ0J9RO1Y90BC0LDFZ
  Raw hex: 0092e965928626f8880629cec353d3fd7ca5974f

所有的ICAP地址都是以XE开头的,你很容易认出它们,注意帐号的Createdkey后面还跟着一个ID,这个就是UUID,这是帐号的唯一标识,没有其他特别的意义,被网络上的黑客获取了没有太大的用处,这个ID也会出现在账户文件中,你可以从下面的位置找到帐号文件:~/.web3/keys (Mac or Linux) 或 $HOME/AppData/Web3/keys (Windows)。我们来列出钱包中的帐号:

> ethkey list
055dde03-47ff-dded-8950-0fe39b1fa101 0092e965… XE472EVKU3CGMJF2YQ0J9RO1Y90BC0LDFZ  test

每一行会显示一个帐号(这里只有一个帐号),在我们的例子中帐号存储在055dde…中并且地址为XE472…记住这些字符串并不容易,所以起了别名test。

导入你预购的以太币

使用以太坊Mist钱包

通过以太坊的GUI客户端Mist导入预售的以太币是非常简单,事实上,在安装的过程中你会被询问是否需要导入预售的以太币。

Warning

Mist钱包还处于测试期,请谨慎使用并自行承担风险。

安装以太坊Mist钱包在前面的章节中已经介绍过了,请自行查看相关章节: Creating an account: Using Mist Ethereum wallet.

你只需要简单地把 .json 文件拖拽到下图中的淡蓝色方框中,并输入你预售帐号的密码。

presale-import

如果你没有在软件安装的过程中导入,那么你可以在任何时间,使用界面菜单中 Accounts 选项下的 Import Pre-sale Accounts 来导入。

Note

以太坊Mist钱包还在继续开发,所以上面所说的一些细节可能会随着升级发生改变。

使用geth

如果你只安装了geth,那么导入预售的以太币只需要在终端使用下面的命令:

geth wallet import /path/to/my/presale-wallet.json

你会被提示要求输入密码。

升级账户

你可以升级你的keyfile到最新的格式,或者修改你的keyfile密码。

使用geth

你可以使用 update 子命令对已有的账号进行升级,参数可以写地址或者帐号索引,请注意帐号索引是以创建时间进行排序的。

geth account update b0047c606f3af7392e073ed13253f8f4710b08b6

geth account update 2

举个例子:

$ geth account update a94f5374fce5edbc8e2a8697c15331677e6ebf0b

Unlocking account a94f5374fce5edbc8e2a8697c15331677e6ebf0b | Attempt 1/3
Passphrase:
0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b
account 'a94f5374fce5edbc8e2a8697c15331677e6ebf0b' unlocked.
Please give a new password. Do not forget this password.
Passphrase:
Repeat Passphrase:
0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b

帐号已经被保存为最新的加密格式,你会被提示输入密码解锁帐号并重新保存升级后的keyfile。你可以通过这个命令将老格式的帐号保存为最新格式的帐号,或者用来更新帐号的密码。

可以使用 --password 参数来实现非交互的密码修改。

geth --password <passwordfile> account update a94f5374fce5edbc8e2a8697c15331677e6ebf0bs

这样只能用来升级帐号的格式,修改交易密码只能通过交互式的命令来进行。

Note

帐号升级有一个副作用,那就是帐号的索引顺序会发生改变,成功升级后,之前的格式/版本都会被移除。

备份和恢复帐号

手动备份/恢复

如果想使用帐号进行交易,那么你必须要有这个帐号对应的keyfile文件,keyfile文件保存在以太坊节点目录的子目录中,默认的存储路径根据平台不同分别如下:

  • Windows: C:\Users\username\%appdata%\Roaming\Ethereum\keystore
  • Linux: ~/.ethereum/keystore
  • Mac: ~/Library/Ethereum/keystore

备份你的keyfiles(帐号),你可以拷贝整个 keystore 目录,或者拷贝 keystore 目录下的单独keyfile。

恢复keyfiles(帐号),你只需要把备份的文件拷贝回默认的 keystore 子目录就行。

导入未加密的私钥

geth 支持导入未加密的私钥。

geth account import /path/to/<keyfile>

这个命令可以导入一个未加密的明文私钥文件 <keyfile> 同时创建一个新的帐号并打印出地址,私钥文件包含一个十六进制的字节序列。新帐号被保存为加密格式,你回被提示输入新密码,请牢记输入的密码,之后用于使用新的帐号。

下面的例子,明确指明了新的数据目录,如果不使用 --datadir 标识,新帐号会被保存在默认的路径,也就是上面列出的默认 keystore 子目录中。

$ geth --datadir /someOtherEthDataDir  account import ./key.prv
The new account will be encrypted with a passphrase.
Please enter a passphrase now.
Passphrase:
Repeat Passphrase:
Address: {7f444580bfef4b9bc7e14eb7fb2a029336b07c9d}

非交互式的方式可以加入 --password 参数来实现:

geth --password <passwordfile> account import <keyfile>

Note

你可以直接拷贝加密帐号文件到一个新的以太坊节点上,所以导入/导出的操作就没有必要了。

Warning

如果你拷贝到已经存在的 keystore 目录中,那么帐号的顺序可能发生改变,因此,你需要确保合约脚本不依赖帐号顺序或者修改脚本中帐号的索引顺序。