区块链教程以太源码分析accounts包简介

accounts包实现了eth客户端的钱包和账户管理。
账号的数据结构:
typeAccount struct {

Address common.Address json:"address" // Ethereum account addressderived from the key

URLURL json:"url" // Optional resource locator within a backend

}
钱包interface,是指包含了一个或多个账户的软件钱包或者硬件钱包
type Wallet struct {
URL() URL // URL 用来获取这个钱包可以访问的规范路径。它会被上层使用用来从所有的后端的钱包来排序。

Status() (string, error) // 用来返回一个文本值用来标识当前钱包的状态。同时也会返回一个error用来标识钱包遇到的任何错误。

Open(passphrase string) error //Open初始化对钱包实例的访问。如果你open了一个钱包,你必须close它。

Close() error // Close 释放由Open方法占用的任何资源。

Accounts() []Account // Accounts用来获取钱包发现了账户列表。对于分层次的钱包,这个列表不会详尽的列出所有的账号,而是只包含在帐户派生期间明确固定的帐户。

Derive(path DerivationPath, pin bool) (Account,error) //Derive尝试在指定的派生路径上显式派生出分层确定性帐户。如果pin为true,派生帐户将被添加到钱包的跟踪帐户列表中。

SelfDerive(base DerivationPath,chain ethereum.ChainStateReader)    //SelfDerive设置一个基本帐户导出路径,从中钱包尝试发现非零帐户,并自动将其添加到跟踪帐户列表中。

SignHash(account Account, hash []byte)([]byte, error)    // SignHash 请求钱包来给传入的hash进行签名。

SignTx(account Account, tx*types.Transaction, chainID *big.Int) (*types.Transaction, error)   // SignTx 请求钱包对指定的交易进行签名。

SignHashWithPassphrase(accountAccount, passphrase string, hash []byte) ([]byte, error)    //SignHashWithPassphrase请求钱包使用给定的passphrase来签名给定的hash

SignTxWithPassphrase(accountAccount, passphrase string, tx *types.Transaction, chainID *big.Int)(*types.Transaction, error)    // SignHashWithPassphrase请求钱包使用给定的passphrase来签名给定的transaction

}
后端Backend,Backend是一个钱包提供器。可以包含一批账号。他们可以根据请求签署交易。
type Backend struct {

Wallets() []wallet   // Wallets获取当前能够查找到的钱包

Subscribe(sink chan <-WalletEvent) event.Subscription    // 订阅创建异步订阅,以便在后端检测到钱包的到达或离开时接收通知。

}
manager.go
Manager是一个包含所有东西的账户管理工具。可以和所有的Backends来通信来签署交易。
eth账户定义,在accounts.keystore.key.go中定义
eth账户主要包含三条信息,ID,地址和公私钥对。
type Keystruct {
IDuuid.UUID
Address common.Address
PrivateKey ecdsa.PrivateKey
}
eth创建账户的流程:
1,用户输入一个密码 (passphrase string)
2,内部通过椭圆曲线算法随机生成一个公私密钥对(internal.ethapi.apinewAccount方法)
3,对公钥hash得到地址
4,对密码使用scrypt算法加密,得到加密后的密码derivedKey
5,用derivedKey的对私钥使用AES-CTR算法加密,得到密文cipherText
6,对derivedKey和cipherText进行hash得到mac,这个mac实际上起到了签名的作用,在解密的时候去验证合法性,防止别人篡改
7,保存账号地址和加密过程中写死或随机生成的参数到json文件中,也就是就是上面的文件
创建账号的核心代码:(accounts.keystore.keystore_passphrase.go)
中的EncryptKey方法
funcEncryptKey(key
Key,authstring,scryptN,scryptPint) ([]byte,error)
其中,key是加密的账号,包含ID,公私钥,地址
auth是用户输入的密码

scryptN,是scrypt算法中的N

scryptP,scrypt算法中的P
derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)
对用户名输入的密码使用scrypt加密,返回一个derivedKey

原文地址:http://blog.51cto.com/12918475/2301173

时间: 2024-08-05 10:35:54

区块链教程以太源码分析accounts包简介的相关文章

区块链教程以太源码分析accounts账户管理分析

区块链教程以太源码分析accounts账户管理分析. 数据结构分析 ETH的账户管理定义在accounts/manager.go中,其数据结构为: // Manager is an overarching account manager that can communicate with various // backends for signing transactions. type Manager struct { backends map[reflect.Type][]Backend /

区块链教程以太坊源码分析core-state-process源码分析(二)

兄弟连区块链教程以太坊源码分析core-state-process源码分析(二):关于g0的计算,在黄皮书上由详细的介绍和黄皮书有一定出入的部分在于if contractCreation && homestead {igas.SetUint64(params.TxGasContractCreation) 这是因为 Gtxcreate+Gtransaction = TxGasContractCreation func IntrinsicGas(data []byte, contractCre

{区块链教程}以太坊源码分析fast sync算法二

{区块链教程}以太坊源码分析fast sync算法二:上面的表格应该这样解释:如果我们每隔K个区块头验证一次区块头,在N个区块头之后,伪造的概率小于***者产生SHA3冲突的概率.这也意味着,如果确实发现了伪造,那么最后的N个头部应该被丢弃,因为不够安全.可以从上表中选择任何{N,K}对,为了选择一个看起来好看点的数字,我们选择N = 2048,K = 100.后续可能会根据网络带宽/延迟影响以及可能在一些CPU性能比较受限的设备上运行的情况来进行调整. Using this caveat ho

区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令二

区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令二.flogging,即:fabric logging,为Fabric基于第三方包go-logging封装的日志包,go-logging使用方法参考:github.com/op/go-logging如下代码为flogging包的初始化函数: func init() { ????logger = logging.MustGetLogger(pkgLogID) //创建仅在flogging包内代码使用的logging.Lo

Java中线程局部变量ThreadLocal使用教程及源码分析

在Java多线程编程中有时候会遇见线程本地局部变量ThreadLocal这个类,下面就来讲讲ThreadLocal的使用及源码分析. ThreadLocal 是Thread Local Varial(线程局部变量)的意思,每个线程在使用线程局部变量的时候都会为使用这个线程局部变量的线程提供一个线程局部变量的副本,使得每个线程都可以完全独立地操作这个线程局部变量,而不会与其他线程发生冲突,从线程的角度来看,每个线程都好像独立地拥有了这个线程局部变量.这样,看似每个线程都在并发访问同一个资源(线程局

区块链教程以太坊源码分析core-state源码分析(二)

## statedb.go stateDB用来存储以太坊中关于merkle trie的所有内容. StateDB负责缓存和存储嵌套状态. 这是检索合约和账户的一般查询界面: 数据结构 type StateDB struct { db Database // 后端的数据库 trie Trie // trie树 main account trie // This map holds 'live' objects, which will get modified while processing a

兄弟连区块链入门教程eth源码分析RPC分析

这是一个交互式的 JavaScript 执行环境,在这里面可以执行 JavaScript 代码,其中 > 是命令提示符.在这个环境里也内置了一些用来操作eth的 JavaScript 对象,可以直接使用这些对象.这些对象主要包括: eth:包含一些跟操作区块链相关的方法:net:包含一些查看p2p网络状态的方法:admin:包含一些与管理节点相关的方法:miner:包含启动&停止挖矿的一些方法:personal:主要包含一些管理账户的方法:txpool:包含一些查看交易内存池的方法:web3

区块链支付钱包系统和传统支付相比有哪些优势?区块链支付钱包源码开发

区块链中点对点连接的分布式记账账本特性和加密算法保障了数据的安全性,解决了交易双方之间的信任问题.区块链钱包的应用能否成为未来世界的银行卡,支付宝?让数字资产储存便捷,一键支付,跨境支付无压力等问题. 说到支付钱包第一想到的就是支付宝了,相信支付宝大家都有用过了吧,说到支付这一块,传统的支付模式早已不见踪影,现在出门买个菜都是扫码支付,买东西都不流行用现金了,无论是大型连锁超市还是街边摆摊的小摊位,常常可以看到支付宝买单的场景.曾经的传统支付模式已经逐渐的被移动支付所取代,可见社会在不断进步.要

什么是区块链北京赛车源码下载平台定制开发钱包?

在介绍区块链钱包之前,我们先详细介绍下比特币的地址生成过程. 北京赛车源码下载平台定制开发[大神源码论坛]dsluntan.com [布丁源码论坛]budingbbs.com 企娥3393756370 红黑玩法定制开发 龙虎和玩法定制开发 大小单双和玩法定制开发 斗牛玩法定制开发 需要的请联系客服:3393756370 大的流程是:私钥-->公钥-->地址. 先啰嗦一点计算机知识:位,字节,字,KB,MB 位:"位(bit)"是电子计算机中最小的数据单位.每一位的状态只能是