精华内容
下载资源
问答
  • 详解私钥、密码、keystore和助记

    千次阅读 2020-10-12 10:21:01
    文章以及资料(开源):github地址 文章目录密码私钥keystore助记词以太坊对BIP的支持密码、私钥、keystore与...私钥由64长度的十六进制的字符组成,比如:0xA4356E49C88C8B7AB370AF7D5C0C54F0261AAA006F6BDE09CD4.

    文章以及资料(开源):github地址

    密码

    首先明白密码不是私钥,它是在创建账户时候的密码(注意可以修改)。密码在以下情况下会使用到:

    1. 作为转账的支付密码
    2. 用keystore导入钱包的时候需要输入的密码,用来解锁keystore的

    私钥

    私钥由64位长度的十六进制的字符组成,比如:0xA4356E49C88C8B7AB370AF7D5C0C54F0261AAA006F6BDE09CD4745CF54E0115A一个账户只有一个私钥且不能修改,。通常一个钱包中私钥和公钥是成对出现的,有了私钥,我们就可以通过一定的算法生成公钥,再通过公钥经过一定的算法生成地址,这一过程都是不可逆的。私钥一定要妥善保管,若被泄漏别人可以通过私钥解锁账号转出你的该账号的数字货币。

    keystore

    Keystore常见于以太坊钱包,它是将私钥以加密的方式保存为一份 JSON 文件,这份 JSON 文件就是 keystore,所以它就是加密后的私钥。Keystore必须配合钱包密码才能使用该账号。

    助记词

    私钥是64位长度的十六进制的字符,不利于记录且容易记错,所以用算法将一串随机数转化为了一串12 ~ 24个容易记住的单词,方便保存记录。注意:

    1. 助记词是私钥的另一种表现形式
    2. 助记词可以获取相关联的多个私钥,反过来私钥没法获取助记词。

    要弄清楚助记词与私钥的关系,得清楚BIP协议,是Bitcoin Improvement Proposals的缩写,意思是Bitcoin 的改进建议,用于提出 Bitcoin 的新功能或改进措施。BIP协议衍生了很多的版本,主要有BIP32、BIP39、BIP44。

    以太坊对BIP的支持

    BIP是用于提出 Bitcoin 的新功能或改进措施,那么对于以太坊来说如何支持呢?

    • 以太坊在EIPs/issues/84中讨论,是否遵循 BIP32 和 BIP44,社区里提出来很多有意思的观点,比特币是基于 UTXO 的,所以可以使用 HD 钱包(BIP32)为每个交易分配一个新地址,以保护您的隐私。然而,以太坊是基于帐户,每个帐户都有一个地址,BIP 是比特币的提案,而且比特币的数据结构的设计是围绕改变地址的想法构建的,BIP 的一些提案可能并不适合以太坊。以太坊的模式和比特币UTXO 不同,以太坊转账不能改变地址,如果在以太坊上实现 UTXO ,用户还必须签名两个交易以将余额的一部分发送到一个地址,将余额的一部分发送到第二个地址 - 这将使成本增加一倍,而且第二个交易可能不会在同一个区块中,当然以太坊也可以通过智能合约的方式实现。另外,以太坊目前官方钱包采用 KDF 的形式,也就是我们常说的 Keystore 的形式。
    • 以太坊在EIPs/issues/85中讨论,以太坊社区似乎也采用了 BIP32 的做法,提议 HD 路径为 : m/44'/60'/0'/0/n,n 是第 n 次生成地址。目前以太坊客户端实现了BIP32的客户端有:Jaxx, Metamask, Exodus, imToken, TREZOR (ETH) & Digital Bitbox

    密码、私钥、keystore与助记词的关系

    image-20201012091537816

    如何解锁账户

    解锁账户有如下几种方式:

    • 私钥(Private Key)
    • Keystore+密码(Keystore+Password)
    • 助记词(Mnemonic code)

    我们可以得到以下总结:

    • 通过私钥+密码可以生成keystore,即加密私钥。
    • 通过keystore+密码可以获取私钥,即解密keystore。
    • 通过助记词根据不同的路径获取不同的私钥,即使用HD钱包将助记词转化成种子来生成主私钥,然后派生海量的子私钥和地址。
    展开全文
  • Java二进制指令代码解析 小注:去年在看《深入解析JVM》书的时候做的一些...Java源码在运行之前都要编译成为字节格式(如.class文件),然后由ClassLoader将字节载入运行。在字节文件中,指令代码只是其中的一部

    本文为转载记录原文地址:感谢博主分享
    Java二进制指令代码解析
    小注:去年在看《深入解析JVM》书的时候做的一些记录,同时参考了《Java虚拟机规范》。只是对指令的一些列举,加入了一些自己的理解。可以用来查询。
    Java二进制指令代码解析
    Java源码在运行之前都要编译成为字节码格式(如.class文件),然后由ClassLoader将字节码载入运行。在字节码文件中,指令代码只是其中的一部分,里面还记录了字节码文件的编译版本、常量池、访问权限、所有成员变量和成员方法等信息(详见Java字节码格式详解)。本文主要简单介绍不同Java指令的功能以及在代码中如何解析二进制指令。

    Java指令是基于栈的体系结构,大部分的指令默认的操作数在栈中。映像中ARM是基于寄存器的操作指令,而x86好像是混合寄存器和存储器的,发现基于栈的操作指令确实简单,学起来很快。不过不知道这种操作的效率怎么样,以我自己的推测应该是不太好的。对这方面不太了解,随便扯几句。

    Java总共有200多条指令,不过很多都是重复的。我的理解,网络是Java一个非常重要的特性,而且Java在设计之初就认为字节码是要在网络中传输的,为了减少网络传输流量,字节码就要尽量设计精简、紧凑。因而Java增加了很多重复指令,比如尽量减少操作数,因而我们会发现Java的很多指令都是没有操作数的;并且指令中的操作数基本上都是当无法将值放到栈中的数据,比如局部变量的索引号和常量池中的索引号。

    还有一点需要注意的是,在运行过程中,所有boolean、byte、char、short都是以int类型值存在,因而对这些类型的指令操作很少。然而好像sun实现的虚拟机中。这些类型的数组据说不是以int类型的形式保存的,这个很奇怪。我的理解,以字对齐方式的操作效率会比较高,因而做了这种转换,以空间换时间。

    Java指令集(按功能分类)

    网上找的没有指令码这列  自己把它加上 更方便查阅 

    指令从0x00-0xc9 没有0xba

    常量入栈指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x01

    aconst_null

     

    null值入栈。

    0x02

    iconst_m1

     

    -1(int)值入栈。

    0x03

    iconst_0

     

    0(int)值入栈。

    0x04

    iconst_1

     

    1(int)值入栈。

    0x05

    iconst_2

     

    2(int)值入栈。

    0x06

    iconst_3

     

    3(int)值入栈。

    0x07

    iconst_4

     

    4(int)值入栈。

    0x08

    iconst_5

     

    5(int)值入栈。

    0x09

    lconst_0

     

    0(long)值入栈。

    0x0a

    lconst_1

     

    1(long)值入栈。

    0x0b

    fconst_0

     

    0(float)值入栈。

    0x0c

    fconst_1

     

    1(float)值入栈。

    0x0d

    fconst_2

     

    2(float)值入栈。

    0x0e

    dconst_0

     

    0(double)值入栈。

    0x0f

    dconst_1

     

    1(double)值入栈。

    0x10

    bipush

    valuebyte

    valuebyte值带符号扩展成int值入栈。

    0x11

    sipush

    valuebyte1

    valuebyte2

    (valuebyte1 << 8) | valuebyte2 值带符号扩展成int值入栈。

    0x12

    ldc

    indexbyte1

    常量池中的常量值(int, float, string reference, object reference)入栈。

    0x13

    ldc_w

    indexbyte1

    indexbyte2

    常量池中常量(int, float, string reference, object reference)入栈。

    0x14

    ldc2_w

    indexbyte1

    indexbyte2

    常量池中常量(long, double)入栈。

     

    局部变量值转载到栈中指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x19

    (wide)aload

    indexbyte

    从局部变量indexbyte中装载引用类型值入栈。

    0x2a

    aload_0

     

    从局部变量0中装载引用类型值入栈。

    0x2b

    aload_1

     

    从局部变量1中装载引用类型值入栈。

    0x2c

    aload_2

     

    从局部变量2中装载引用类型值入栈。

    0x2d

    aload_3

     

    从局部变量3中装载引用类型值入栈。

    0x15

    (wide)iload

    indexbyte

    从局部变量indexbyte中装载int类型值入栈。

    0x1a

    iload_0

     

    从局部变量0中装载int类型值入栈。

    0x1b

    iload_1

     

    从局部变量1中装载int类型值入栈。

    0x1c

    iload_2

     

    从局部变量2中装载int类型值入栈。

    0x1d

    iload_3

     

    从局部变量3中装载int类型值入栈。

    0x16

    (wide)lload

    indexbyte

    从局部变量indexbyte中装载long类型值入栈。

    0x1e

    lload_0

     

    从局部变量0中装载int类型值入栈。

    0x1f

    lload_1

     

    从局部变量1中装载int类型值入栈。

    0x20

    lload_2

     

    从局部变量2中装载int类型值入栈。

    0x21

    lload_3

     

    从局部变量3中装载int类型值入栈。

    0x17

    (wide)fload

    indexbyte

    从局部变量indexbyte中装载float类型值入栈。

    0x22

    fload_0

     

    从局部变量0中装载float类型值入栈。

    0x23

    fload_1

     

    从局部变量1中装载float类型值入栈。

    0x24

    fload_2

     

    从局部变量2中装载float类型值入栈。

    0x25

    fload_3

     

    从局部变量3中装载float类型值入栈。

    0x18

    (wide)dload

    indexbyte

    从局部变量indexbyte中装载double类型值入栈。

    0x26

    dload_0

     

    从局部变量0中装载double类型值入栈。

    0x27

    dload_1

     

    从局部变量1中装载double类型值入栈。

    0x28

    dload_2

     

    从局部变量2中装载double类型值入栈。

    0x29

    dload_3

     

    从局部变量3中装载double类型值入栈。

    0x32

    aaload

     

    从引用类型数组中装载指定项的值。

    0x2e

    iaload

     

    从int类型数组中装载指定项的值。

    0x2f

    laload

     

    从long类型数组中装载指定项的值。

    0x30

    faload

     

    从float类型数组中装载指定项的值。

    0x31

    daload

     

    从double类型数组中装载指定项的值。

    0x33

    baload

     

    从boolean类型数组或byte类型数组中装载指定项的值(先转换为int类型值,后压栈)。

    0x34

    caload

     

    从char类型数组中装载指定项的值(先转换为int类型值,后压栈)。

    0x35

    saload

     

    从short类型数组中装载指定项的值(先转换为int类型值,后压栈)。

     

    将栈顶值保存到局部变量中指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x3a

    (wide)astore

    indexbyte

    将栈顶引用类型值保存到局部变量indexbyte中。

    0x4b

    astroe_0

     

    将栈顶引用类型值保存到局部变量0中。

    0x4c

    astore_1

     

    将栈顶引用类型值保存到局部变量1中。

    0x4d

    astore_2

     

    将栈顶引用类型值保存到局部变量2中。

    0x4e

    astore_3

     

    将栈顶引用类型值保存到局部变量3中。

    0x36

    (wide)istore

    indexbyte

    将栈顶int类型值保存到局部变量indexbyte中。

    0x3b

    istore_0

     

    将栈顶int类型值保存到局部变量0中。

    0x3c

    istore_1

     

    将栈顶int类型值保存到局部变量1中。

    0x3d

    istore_2

     

    将栈顶int类型值保存到局部变量2中。

    0x3e

    istore_3

     

    将栈顶int类型值保存到局部变量3中。

    0x37

    (wide)lstore

    indexbyte

    将栈顶long类型值保存到局部变量indexbyte中。

    0x3f

    lstore_0

     

    将栈顶long类型值保存到局部变量0中。

    0x40

    lstore_1

     

    将栈顶long类型值保存到局部变量1中。

    0x41

    lstore_2

     

    将栈顶long类型值保存到局部变量2中。

    0x42

    lstroe_3

     

    将栈顶long类型值保存到局部变量3中。

    0x38

    (wide)fstore

    indexbyte

    将栈顶float类型值保存到局部变量indexbyte中。

    0x43

    fstore_0

     

    将栈顶float类型值保存到局部变量0中。

    0x44

    fstore_1

     

    将栈顶float类型值保存到局部变量1中。

    0x45

    fstore_2

     

    将栈顶float类型值保存到局部变量2中。

    0x46

    fstore_3

     

    将栈顶float类型值保存到局部变量3中。

    0x39

    (wide)dstore

    indexbyte

    将栈顶double类型值保存到局部变量indexbyte中。

    0x47

    dstore_0

     

    将栈顶double类型值保存到局部变量0中。

    0x48

    dstore_1

     

    将栈顶double类型值保存到局部变量1中。

    0x49

    dstore_2

     

    将栈顶double类型值保存到局部变量2中。

    0x4a

    dstore_3

     

    将栈顶double类型值保存到局部变量3中。

    0x53

    aastore

     

    将栈顶引用类型值保存到指定引用类型数组的指定项。

    0x4f

    iastore

     

    将栈顶int类型值保存到指定int类型数组的指定项。

    0x50

    lastore

     

    将栈顶long类型值保存到指定long类型数组的指定项。

    0x51

    fastore

     

    将栈顶float类型值保存到指定float类型数组的指定项。

    0x52

    dastore

     

    将栈顶double类型值保存到指定double类型数组的指定项。

    0x54

    bastroe

     

    将栈顶boolean类型值或byte类型值保存到指定boolean类型数组或byte类型数组的指定项。

    0x55

    castore

     

    将栈顶char类型值保存到指定char类型数组的指定项。

    0x56

    sastore

     

    将栈顶short类型值保存到指定short类型数组的指定项。

     

    wide指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xc4

    wide

     

    使用附加字节扩展局部变量索引(iinc指令特殊)。

     

    通用(无类型)栈操作指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x00

    nop

     

    空操作。

    0x57

    pop

     

    从栈顶弹出一个字长的数据。

    0x58

    pop2

     

    从栈顶弹出两个字长的数据。

    0x59

    dup

     

    复制栈顶一个字长的数据,将复制后的数据压栈。

    0x5a

    dup_x1

     

    复制栈顶一个字长的数据,弹出栈顶两个字长数据,先将复制后的数据压栈,再将弹出的两个字长数据压栈。

    0x5b

    dup_x2

     

    复制栈顶一个字长的数据,弹出栈顶三个字长的数据,将复制后的数据压栈,再将弹出的三个字长的数据压栈。

    0x5c

    dup2

     

    复制栈顶两个字长的数据,将复制后的两个字长的数据压栈。

    0x5d

    dup2_x1

     

    复制栈顶两个字长的数据,弹出栈顶三个字长的数据,将复制后的两个字长的数据压栈,再将弹出的三个字长的数据压栈。

    0x5e

    dup2_x2

     

    复制栈顶两个字长的数据,弹出栈顶四个字长的数据,将复制后的两个字长的数据压栈,再将弹出的四个字长的数据压栈。

    0x5f

    swap

     

    交换栈顶两个字长的数据的位置。Java指令中没有提供以两个字长为单位的交换指令。

     

    类型转换指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x86

    i2f

     

    将栈顶int类型值转换为float类型值。

    0x85

    i2l

     

    将栈顶int类型值转换为long类型值。

    0x87

    i2d

     

    将栈顶int类型值转换为double类型值。

    0x8b

    f2i

     

    将栈顶float类型值转换为int类型值。

    0x8c

    f2l

     

    将栈顶float类型值转换为long类型值。

    0x8d

    f2d

     

    将栈顶float类型值转换为double类型值。

    0x88

    l2i

     

    将栈顶long类型值转换为int类型值。

    0x89

    l2f

     

    将栈顶long类型值转换为float类型值。

    0x8a

    l2d

     

    将栈顶long类型值转换double类型值。

    0x8e

    d2i

     

    将栈顶double类型值转换为int类型值。

    0x90

    d2f

     

    将栈顶double类型值转换为float类型值。

    0x8f

    d2l

     

    将栈顶double类型值转换为long类型值。

    0x91

    i2b

     

    将栈顶int类型值截断成byte类型,后带符号扩展成int类型值入栈。

    0x92

    i2c

     

    将栈顶int类型值截断成char类型值,后带符号扩展成int类型值入栈。

    0x93

    i2s

     

    将栈顶int类型值截断成short类型值,后带符号扩展成int类型值入栈。

     

    整数运算

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x60

    iadd

     

    将栈顶两int类型数相加,结果入栈。

    0x64

    isub

     

    将栈顶两int类型数相减,结果入栈。

    0x68

    imul

     

    将栈顶两int类型数相乘,结果入栈。

    0x6c

    idiv

     

    将栈顶两int类型数相除,结果入栈。

    0x70

    irem

     

    将栈顶两int类型数取模,结果入栈。

    0x74

    ineg

     

    将栈顶int类型值取负,结果入栈。

    0x61

    ladd

     

    将栈顶两long类型数相加,结果入栈。

    0x65

    lsub

     

    将栈顶两long类型数相减,结果入栈。

    0x69

    lmul

     

    将栈顶两long类型数相乘,结果入栈。

    0x6d

    ldiv

     

    将栈顶两long类型数相除,结果入栈。

    0x71

    lrem

     

    将栈顶两long类型数取模,结果入栈。

    0x75

    lneg

     

    将栈顶long类型值取负,结果入栈。

    0x84

    (wide)iinc

    indexbyte

    constbyte

    将整数值constbyte加到indexbyte指定的int类型的局部变量中。

     

    浮点运算

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x62

    fadd

     

    将栈顶两float类型数相加,结果入栈。

    0x66

    fsub

     

    将栈顶两float类型数相减,结果入栈。

    0x6a

    fmul

     

    将栈顶两float类型数相乘,结果入栈。

    0x6e

    fdiv

     

    将栈顶两float类型数相除,结果入栈。

    0x72

    frem

     

    将栈顶两float类型数取模,结果入栈。

    0x76

    fneg

     

    将栈顶float类型值取反,结果入栈。

    0x63

    dadd

     

    将栈顶两double类型数相加,结果入栈。

    0x67

    dsub

     

    将栈顶两double类型数相减,结果入栈。

    0x6b

    dmul

     

    将栈顶两double类型数相乘,结果入栈。

    0x6f

    ddiv

     

    将栈顶两double类型数相除,结果入栈。

    0x73

    drem

     

    将栈顶两double类型数取模,结果入栈。

    0x77

    dneg

     

    将栈顶double类型值取负,结果入栈。

     

    逻辑运算——移位运算

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x78

    ishl

     

    左移int类型值。

    0x79

    lshl

     

    左移long类型值。

    0x7a

    ishr

     

    算术右移int类型值。

    0x7b

    lshr

     

    算术右移long类型值。

    0x7c

    iushr

     

    逻辑右移int类型值。

    0x7d

    lushr

     

    逻辑右移long类型值。

     

    逻辑运算——按位布尔运算

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x73

    iand

     

    对int类型按位与运算。

    0x7f

    land

     

    对long类型的按位与运算。

    0x80

    ior

     

    对int类型的按位或运算。

    0x81

    lor

     

    对long类型的按位或运算。

    0x82

    ixor

     

    对int类型的按位异或运算。

    0x83

    lxor

     

    对long类型的按位异或运算。

     

    控制流指令——条件跳转指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x99

    ifeq

    branchbyte1

    branchbyte2

    若栈顶int类型值为0则跳转。

    0x9a

    ifne

    branchbyte1

    branchbyte2

    若栈顶int类型值不为0则跳转。

    0x9b

    iflt

    branchbyte1

    branchbyte2

    若栈顶int类型值小于0则跳转。

    0x9e

    ifle

    branchbyte1

    branchbyte2

    若栈顶int类型值小于等于0则跳转。

    0x9d

    ifgt

    branchbyte1

    branchbyte2

    若栈顶int类型值大于0则跳转。

    0x9c

    ifge

    branchbyte1

    branchbyte2

    若栈顶int类型值大于等于0则跳转。

    0x9f

    if_icmpeq

    branchbyte1

    branchbyte2

    若栈顶两int类型值相等则跳转。

    0xa0

    if_icmpne

    branchbyte1

    branchbyte2

    若栈顶两int类型值不相等则跳转。

    0xa1

    if_icmplt

    branchbyte1

    branchbyte2

    若栈顶两int类型值前小于后则跳转。

    0xa4

    if_icmple

    branchbyte1

    branchbyte2

    若栈顶两int类型值前小于等于后则跳转。

    0xa3

    if_icmpgt

    branchbyte1

    branchbyte2

    若栈顶两int类型值前大于后则跳转。

    0xa2

    if_icmpge

    branchbyte1

    branchbyte2

    若栈顶两int类型值前大于等于后则跳转。

    0xc6

    ifnull

    branchbyte1

    branchbyte2

    若栈顶引用值为null则跳转。

    0xc7

    ifnonnull

    branchbyte1

    branchbyte2

    若栈顶引用值不为null则跳转。

    0xa5

    if_acmpeq

    branchbyte1

    branchbyte2

    若栈顶两引用类型值相等则跳转。

    0xa6

    if_acmpne

    branchbyte1

    branchbyte2

    若栈顶两引用类型值不相等则跳转。

     

    控制流指令——比较指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0x94

    lcmp

     

    比较栈顶两long类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈。

    0x95

    fcmpl

     

    比较栈顶两float类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

    0x96

    fcmpg

     

    比较栈顶两float类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

    0x97

    dcmpl

     

    比较栈顶两double类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

    0x98

    dcmpg

     

    比较栈顶两double类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

     

    控制流指令——无条件跳转指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xa7

    goto

    branchbyte1

    branchbyte2

    无条件跳转到指定位置。

    0xc8

    goto_w

    branchbyte1

    branchbyte2

    branchbyte3

    branchbyte4

    无条件跳转到指定位置(宽索引)。

     

    控制流指令——表跳转指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xaa

    tableswitch

    <0-3bytepad>

    defaultbyte1

    defaultbyte2

    defaultbyte3

    defaultbyte4

    lowbyte1

    lowbyte2

    lowbyte3

    lowbyte4

    highbyte1

    highbyte2

    highbyte3

    highbyte4

    jump offsets…

    通过索引访问跳转表,并跳转。

    0xab

    lookupswitch

    <0-3bytepad>

    defaultbyte1

    defaultbyte2

    defaultbyte3

    defaultbyte4

    npairs1

    npairs2

    npairs3

    npairs4

    match offsets

    通过键值访问跳转表,并跳转。

     

    控制流指令——异常和finally

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xbf

    athrow

     

    抛出异常。

    0xa8

    jsr

    branchbyte1

    branchbyte2

    跳转到子例程序。

    0xc9

    jsr_w

    branchbyte1

    branchbyte2

    branchbyte3

    branchbyte4

    跳转到子例程序(宽索引)。

    0xa9

    (wide)ret

    indexbyte

    返回子例程序。

     

    对象操作指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xbb

    new

    indexbyte1

    indexbyte2

    创建新的对象实例。

    0xc0

    checkcast

    indexbyte1

    indexbyte

    类型强转。

    0xc1

    instanceof

    indexbyte1

    indexbyte2

    判断类型。

    0xb4

    getfield

    indexbyte1

    indexbyte2

    获取对象字段的值。

    0xb5

    putfield

    indexbyte1

    indexbyte2

    给对象字段赋值。

    0xb2

    getstatic

    indexbyte1

    indexbyte2

    获取静态字段的值。

    0xb3

    putstatic

    indexbyte1

    indexbyte2

    给静态字段赋值。

     

    数组操作指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xbc

    newarray

    atype

    创建type类型的数组。

    0xbd

    anewarray

    indexbyte1

    indexbyte2

    创建引用类型的数组。

    0xbe

    arraylength

     

    获取一维数组的长度。

    0xc5

    multianewarray

    indexbyte1

    indexbyte2

    dimension

    创建dimension维度的数组。

     

    方法调用指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xb7

    invokespecial

    indexbyte1

    indexbyte2

    编译时方法绑定调用方法。

    0xb6

    invokevirtual

    indexbyte1

    indexbyte2

    运行时方法绑定调用方法。

    0xb8

    invokestatic

    indexbyte1

    indexbyte2

    调用静态方法。

    0xb9

    invokeinterface

    indexbyte1

    indexbyte2

    count

    0

    调用接口方法。

     

    方法返回指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xac

    ireturn

     

    返回int类型值。

    0xad

    lreturn

     

    返回long类型值。

    0xae

    freturn

     

    返回float类型值。

    0xaf

    dreturn

     

    返回double类型值。

    0xb0

    areturn

     

    返回引用类型值。

    0xb1

    return

     

    void函数返回。

     

    线程同步指令

    指令码

    操作码(助记符)

    操作数

    描述(栈指操作数栈)

    0xc2

    monitorenter

     

    进入并获得对象监视器。

    0xc3

    monitorexit

     

    释放并退出对象监视器。

    展开全文
  • 助记

    千次阅读 2020-06-19 15:55:11
    助记助记词顾名思义就是用来辅助记忆私钥的,私钥是32个字节数字,如:0xa8d264b13e6c7949fc31c0c7555fe10849d0f3f05af0a1ffeb8239f68b2fe7e1 ,不利于记忆,如果是以单词的形式记忆起来就好很多了。助记词一般由12...

    助记词

    助记词顾名思义就是用来辅助记忆私钥的,私钥是32个字节数字,如:0xa8d264b13e6c7949fc31c0c7555fe10849d0f3f05af0a1ffeb8239f68b2fe7e1 ,不利于记忆,如果是以单词的形式记忆起来就好很多了。助记词一般由12/24个单词构成,2个单词之间由1个空格隔开,这些单词都来源于一个固定词库,是由私钥根据一定算法得来,所以助记词是私钥的另一种表现形式。

    根据BIP39规范提出了一种计算私钥的方式,首先选择2048(0x800)个常用单词组成一个数组,私钥种子可以是128位或256位,再将私钥种子进行哈希h = hash256(seed),并将哈希结果的前几位(0101或00101100)放入私钥(128/256位)后,总位数为11的整数倍。

    000 0010 0001(11位)组成的一个十进制数,对应之前2048个单词的数组中的一个数组下标,11位二进制(0x7FF)组成的数,0~2048,每一个对应一个单词,所有的私钥的位数组成一组单词即为助记词。

    最后将私钥,助记词,地址,keystore扩展类比一下:

    地址=银行卡号
    密码=银行卡密码
    私钥=银行卡号+银行卡密码
    助记词=银行卡号+银行卡密码
    Keystore+密码=银行卡号+银行卡密码
    Keystore ≠ 银行卡号

    展开全文
  • BIP39描述了如何生成助记符,并将其转换为二进制种子。该种子可以生成确定性钱包。  如何生层助记词  我们先看看助记词范围——单词表。生成助记词的过程就是这个表里(2048个单词,记住这个数值)选出12个单词...

         BIP39描述了如何生成助记符,并将其转换为二进制种子。该种子可以生成确定性钱包。

         如何生层助记词

        我们先看看助记词范围——单词表。生成助记词的过程就是这个表里(2048个单词,记住这个数值)选出12个单词。是不是很简单,你可能会想我自己挑选12个不就OK了;这就有个概率的问题,你自己选的和别人选的,有多大概率重复呢?你想想你注册某个网站起名字的时候就知道了,是不是经常重复?所以说生成助记词的难点就是如何让每个钱包的助记词都不一样,和区块链里账户的地址,还有hash等是一个道理。

          1、生成一个128~256bit的熵(熵的解释可以看一下附录)。这里规定了熵只能是32的整数倍,熵值越大,越安全,助记词也会越多。熵的长度成为ENT(128~256);熵的来源比较重要,一般肯能使用的OS提供,用户不会感知这个过程;有些为了提高熵值,会让用户通过摄像头取获取照相,毕竟每个人照像一样的概率很小吧。

          2、取熵哈希后的前CS位作为校验值,这里CS=ENT/32。CS取值4,5,6,7,8 。

          3、生成一个新的序列,熵+校验值。

          4、把步骤3中的序列,按照11bit进行切割;为什么是11呢?上边说了2048个助记词,2^{11}=2048。如果我们这2048个词编个号,则每11bit就对应一个单词。

    序号单词
    00000000000abandon
    ... ... ... ... 
    11111111111zoo

         5、步骤四中依次产生的单词就是助记词了。

    ENT:熵长度。CS:校验长度。MS:助记词长度。之间的关系如下:

    CS = ENT / 32
    MS = (ENT + CS) / 11
    
    |  ENT  | CS | ENT+CS |  MS  |
    +-------+----+--------+------+
    |  128  |  4 |   132  |  12  |
    |  160  |  5 |   165  |  15  |
    |  192  |  6 |   198  |  18  |
    |  224  |  7 |   231  |  21  |
    |  256  |  8 |   264  |  24  |

     

    助记词生成种子

    6、我们使用PBKDF2函数,助记词作为密码,"mnemonic" +passphrase作盐。有了这两个参数就可以进行下一步了。用户可以决定用passphrase。如果不存在passphrase,则使用空字符串“”。(PBKDF2的解释可以看一下附录里的key stretching)

    7、HMAC-SHA512用作伪随机函数,迭代计数设置为2048。

    8、生成长度为512bit的种子。

    至此就完成了,下一步就可以拿着种子去生成私钥了。

         这玩意儿接触越多,越觉得像量子力学,一个庞大稳定的系统建立在一个依赖概率的密码学之上。

    附录:

        熵:熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论里面,熵是对不确定性的测量。我们知道,任何粒子的常态都是随机运动,也就是"无序运动",如果让粒子呈现"有序化",必须耗费能量。所以,温度(热能)可以被看作"有序化"的一种度量,而"熵"可以看作是"无序化"的度量。

         1948年,香农Claude E. Shannon引入信息(熵),将其定义为离散随机事件的出现概率。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。所以说,信息熵可以被认为是系统有序化程度的一个度量。

         文章开始也说了我们需要每个钱包生成助记词都不一样,当然是希望熵高,混乱,就是每个钱包的熵值都不一样的。

    Key stretching 在密码学中,秘钥延伸技术通常用来增加弱密码的安全性,增加暴力破解 (Brute-force attack) 密码时花费的时间。任何系统中都会有弱密码的存在,尤其是人为设定的密码,通常都比较短,或者有规律可循,以致于容易被暴力破解出来。秘钥延伸技术让这种攻击更难成功。

         密钥延伸技术的工作机制,算法的输入是初始key, 算法的输出是增强key。 增强key应该足够长以抵御暴力破解(至少128bits)。这个算法的基本要求是:找不到一个比该算法能更快能从初始key算出增强key的捷径。

        PBKDF2(Password-Based Key Derivation Function 2) 是常用的 key stretching 算法中的一种。基本原理是通过一个为随机函数(例如 HMAC 函数),把明文和盐值作为输入参数,然后重复进行运算最终产生密钥。 

     

    展开全文
  • 助记词是什么,有什么用?

    千次阅读 2019-02-04 19:36:34
    助记词是什么,有什么用?... 对于普通用户来说,如果只是一味的向他们强调助记词重要性的结论,而不告诉背后的原因的话,是很难调动起人的底层动力的,很可能过天就忘了助记词的重要性(小编已经看...
  •  JVM指令集(指令助记符、功能描述) 指令 助记符 功能描述 0x00 nop 无操作   0x01 aconst_null   指令格式: aconst_null   ...
  • 同样助记词也要妥善保管好,切勿在联网设备中传输,任何人得到了你的助记词都可以轻松的转移你的区块链资产。 keystore+密码=私钥。 keyStore文件是以太坊钱包存储私钥的一种文件格式(JSON格式)。它使用用户自定义...
  • 钱包的原理-助记

    万次阅读 2018-06-07 17:10:56
    经过前面篇文章的解读,我们知道一个私钥生成公钥,公钥生成地址,这三者是一一对应的,就是一个私钥只有一个公钥和一个地址。但是我们在往交易所充币的时候,看到交易所为我们每个人生成一个独一无二的地址。这是...
  • 比特币钱包(4) BIP39 助记

    千次阅读 2021-03-06 13:40:55
    助记词句子作为密码,使用若干个助记词来替换之前直接生成随机数的方式(确定性钱包的种子随机数) 2. 生成步骤 1) . 生成 128~256 (bits) 的随机数,称为熵(以128bits为例); 规定熵的位数必须是 32 的整数倍,...
  • 私钥,公钥,钱包地址,助记词,keyStore的区别 私钥:本质上是一个包含64的随机数,是随机生成的 公钥:公钥是由私钥经过加密算法后生成的,拥有私钥,可以算出公钥,拥有公钥却不能算出私钥 钱包地址:...
  • 简单科普私钥、地址、助记词、Keystore的区别  苏江同学 关注 2017.10.31 21:03* 字数 1589 阅读 13437评论 10喜欢 18赞赏 3 很多人保管不好自己的虚拟财产,发生丢币的情况,很多都是因为不清楚私钥的概念...
  • 能把它想象成一串数字,然后在本子上或者保存在电子设备中吗?答案是否定的。比特币的体现就是区块链上的一个个交易,在交易中承担了支付功能。而启用交易的唯一条件就是提供正确的签名,签名所需要的就是私钥。...
  • 一维和二位码主要原理

    万次阅读 2013-04-08 22:54:47
     Code39(标准39)、Codabar(库德巴)、Code25(标准25)、ITF25(交叉25)、Matrix25(矩阵 25)、UPC-A、UPC-E、EAN-13(EAN-13国际商品条码)、EAN-8(EAN-8国际商品条码)、中国...
  • JVM字节执行模型及字节指令集

    万次阅读 2015-06-19 16:25:05
    JVM执行模型,是如何把Class文件里的字节转换成我们的虚拟机栈的操作指令,以及整个虚拟机栈的内部数据结构是怎样的,这篇文章后续会详细介绍,并且稍微扩展下JVM规范中的一些字节指令集。
  • 10个python办公黑科技,你办公效率提高100倍

    万次阅读 多人点赞 2021-06-02 11:46:55
    参数 i 为第列,由于 i 是从 0 开始到当前列元素长度位置进行对 column_name_list 的遍历,此时则是从 0 到 column_name_list 的最后一个元素,那么将会从最开头的列到对应最尾的列,则将所有列名填写值 sheet 页...
  • 《图解密码技术》

    千次阅读 2019-05-16 15:07:46
    基本概念 ... 伪随机 信息传递时面临的风险: 窃听 -> 对称、公钥密码 篡改 -> 散列函数、消息认证、数字签名 伪装 -> 消息认证、数字签名 否认 -> 数字签名 有悖常识的点: ...
  • 字符,字节和编码, ASCII, DBCS,SBCS 与Unicode http://www.regexlab.com/zh/encoding.htm 1. 编码问题的由来,相关概念的理解 1.1 字符与编码的发展 从计算机对多国语言的支持角度看,大致可以分为...
  • 一、ASCII、机内码、区位、国标、Unicode他们之间是如何转换的,方程式是什么 汉字系统中的过程包括区位、国标和机内码,其中的转换关系如下: ...再把位码48转换为16进制为30,得到十六进制3630。
  • 一、ASCII、机内码、区位、国标、Unicode他们之间是如何转换的,方程式是什么 汉字系统中的过程包括区位、国标和机内码,其中的转换关系如下:...再把位码48转换为16进制为30,得到十六进制3630。 2.国
  • UDS暂定的数据协议中,错误码位为一个byte,可以表示理论上256个故障,被分为了大约20~30个专用错误与可扩展的区间。官方定义是三个大的区间:0x00;0x01~7F;0x80~0xFF.但是内部有很多的预留码值,所以被分开了大约...
  • Java 字节指令是 JVM 体系中非常难啃的一块硬骨头,我估计有些读者会有这样的疑惑,“Java 字节难学吗?我能不能学会啊?” 讲良心话,不是我谦虚,一开始学 Java 字节和 Java 虚拟机方面的知识我也感觉头大!...
  • JVM字节指令 及 反编译分析

    千次阅读 2016-12-26 22:46:51
    通过前文知道Class文件中的各方法表的"code"属性存储了对应的JVM字节指令,下面详细了解JVM字节指令:先对字节指令组成结构有个大体了解,并通过前面的"getMap"方法的字节数据来分析JVM指令及操作码助记符,...
  • X86机器

    千次阅读 2009-09-01 18:05:00
    OpCode(操作) 和 mnemonic(助记符) 是多对多的OpCode由6个域组成,其中code是必须的,其他是可选的a. Prefixes b. code c. ModR/M d. SIB e. Displacement f. Immediatea. 前缀 b. 操作 c. ModR/M d. SIB e. ...
  • 区块链资产钱包的使用会越来越频繁和重要,因此我们在使用钱包时,有个名词必须理解,不然就有可能造成区块链资产的损失,这个名词为地址、密码、私钥、助记词、keystore。 若以银行账户为类比,这 5 个词分别...
  • 分多址(CDMA)的本质-正交之美

    万次阅读 多人点赞 2011-05-14 22:26:00
    我认为理解一个概念最好不要从数学开始,数学化的东西只是一个总结,一种表述方式罢了,正如音乐的实质不在五线谱原理和简谱助记法而在旋律本身一样,我敢肯定任何科学理论的提出都不是从数学开始的,但是却总是归于...
  • 立即

    千次阅读 2018-04-23 15:25:44
    通常把在立即寻址方式指令中给出的称为...立即可以是8、16或32,该数值紧跟在操作之后。 如果立即为16或32,那么,它将按“高高低低”的原则进行存储。 例如:  MOV AH, 80H ADD AX, 1234H...
  • Unicode(统一、万国、单一

    千次阅读 2019-06-08 18:01:00
    Unicode(统一、万国、单一) Unicode(统一、万国、单一)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本...
  • java js 汉字对应拼音,五笔转换

    千次阅读 2019-09-27 07:38:57
    最近做项目的时候,要求将汉字名称自动生成拼音和五笔,用于搜索,排列分组等 例如: 在记录中生成拼音和五笔保存,可由于后续查询搜索 下图中就可根据拼音或者五笔输入到名称里查询信息——具体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,759
精华内容 19,503
关键字:

助记码是几位数的