accounts.go

BigJeffWang · · 1318 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package accounts

import (
   "math/big"

   ethereum "github.com/ethereum/go-ethereum-test"
   "github.com/ethereum/go-ethereum-test/common"
   "github.com/ethereum/go-ethereum/core/types"
   "github.com/ethereum/go-ethereum-test/event"
)

// 一个账号是20个字节的数据。 URL是可选的字段。
type Account struct {
   Address common.Address `json:"address"` // Ethereum帐户地址 AddressLength = 20
   URL     URL            `json:"url"`     // 后端可选的资源定位器
}

type Wallet interface {
   // URL检索可访问此钱包的规范路径。它是
   //用户通过上层定义一个排序顺序从多个钱包
   //后端。
   URL() URL

   //状态返回文本状态,以帮助处于当前状态的用户
   //钱包。它还返回一个错误,指示钱包可能出现的任何故障
   //遇到
   Status() (string, error)

   // Open初始化对wallet实例的访问。它不是用来解锁的
   //解密帐户密钥,而不是简单地建立到硬件的连接
   //钱包和/或访问派生种子。
   //
   //密码短语参数可能被a的实现使用,也可能不被使用
   //特别的钱包实例。没有密码开启方法的原因
   //是努力统一钱包处理,无视不同
   //后端提供者。
   //
   //请注意,如果你打开一个钱包,你必须关闭它以释放任何分配
   //资源(在使用硬件钱包时尤其重要)。
   Open(passphrase string) error

   //关闭释放由open wallet实例持有的任何资源。
   Close() error

   //帐户检索钱包当前知道的签名帐户列表
   //of.对于等级决定论的钱包,列表不会是详尽的,
   //只包含在帐户派生期间显式固定的帐户。
   Accounts() []Account

   //包含一个帐户是否属于这个钱包的返回值。
   Contains(account Account) bool

   //派生试图显式地派生一个层次决定论帐户
   //指定的派生路径。如果需要,派生帐户将被添加
   //到钱包的跟踪账户列表。
   Derive(path DerivationPath, pin bool) (Account, error)  // DerivationPath 是[]uint32类型

   //selfderived设置了一个基本帐户派生路径,钱包从中尝试
   //发现非零帐户并自动添加到跟踪列表
   //账户。
   //注意,自派生将增加指定路径的最后一个组件
   //反对使用子路径来查找帐户
   //非零分量。
   //
   //你可以通过调用nil调用selfderived
   //链状态读者。
   SelfDerive(base DerivationPath, chain ethereum.ChainStateReader)
   // SignHash请求钱包在给定的hash上签名。
   //
   //它只通过其中包含的地址查找指定的帐户,
   //或通过嵌入URL字段的任何位置元数据进行选择。
   //
   //如果钱包需要额外的身份验证来签署请求(例如
   //解密账户密码,或验证交易的PIN码
   //将返回一个AuthNeededError实例,其中包含用户的信息
   //关于哪些字段或操作是需要的。用户可以通过提供重试
   //通过SignHashWithPassphrase或通过其他方式(例如解锁)提供所需的详细信息
   //密钥存储库中的帐户)
   SignHash(account Account, hash []byte) ([]byte, error)

   // SignTx请求钱包在指定的交易中签名。
   //
   //它只通过其中包含的地址查找指定的帐户,
   //或通过嵌入URL字段的任何位置元数据进行选择。
   //
   //如果钱包需要额外的身份验证来签署请求(例如
   //密码解密账户,或PIN码验证交易),
   //将返回一个AuthNeededError实例,其中包含用户的信息
   //关于哪些字段或操作是需要的。用户可以通过提供重试
   //通过SignTxWithPassphrase或其他方式(例如解锁)获得所需的详细信息
   //密钥存储库中的帐户)。
   SignTx(account Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error)
   // SignHashWithPassphrase请求钱包用
   //指定密码作为额外的身份验证信息。
   //
   //它只通过其中包含的地址查找指定的帐户,
   //或通过嵌入URL字段的任何位置元数据进行选择。
   SignHashWithPassphrase(account Account, passphrase string, hash []byte) ([]byte, error)
   // SignTxWithPassphrase请求钱包在给定的事务中签名
   //指定密码作为额外的身份验证信息。
   //
   //它只通过其中包含的地址查找指定的帐户,
   //或通过嵌入URL字段的任何位置元数据进行选择。
   SignTxWithPassphrase(account Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error)

}

type Backend interface {
   //钱包检索后端当前知道的钱包列表。
   //
   //默认情况下,归还的钱包不会被打开。对于软件HD钱包这
   //意味着没有基本的种子被解密,对于硬件钱包来说没有实际的
   //建立连接。
   //
   //结果钱包列表将根据内部的字母顺序进行排序
   // URL由后端分配。因为钱包(尤其是硬件)可能会来
   //go,同一个钱包可能会出现在列表的不同位置
   //以后的检索。
   Wallets() []Wallet

   //订阅创建一个异步订阅来接收通知
   //后端检测钱包的到达或离开。
   Subscribe(sink chan<- WalletEvent) event.Subscription
}

type WalletEventType int

type WalletEvent struct {
   Wallet Wallet          // Wallet 实例 到达 或者 离开
   Kind   WalletEventType // 系统中发生的事件类型 int类型
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1318 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传