eip title author type category status created
55
Mixed-case checksum address encoding
Vitalik Buterin
Standards Track
ERC
Final
2016-01-14

Specification(python)

from ethereum import utils

def checksum_encode(addr): # Takes a -byte binary address as input
o = ''
v = utils.big_endian_to_int(utils.sha3(addr.hex()))
for i, c in enumerate(addr.hex()):
if c in ''://就是如果address在i位置上的值是数字的话,就不做任何改变
o += c
else: //但是如果是字符的话,就要另进行判断,(2**(255 - 4*i))这个的二进制的结果就是从后向前数的255 - 4*i个位置上的值为1,即是为了实现从前往后数为4*i位置的数字
o += c.upper() if (v & (**( - *i))) else c.lower()//255的原因是hash的v有32bytes,即32*8=256,从0开始
//所以意思是如果小写十六进制地址的散列v的第4*i位也是1,则以大写形式打印,否则以小写形式打印。
return '0x'+o def test(addrstr):
assert(addrstr == checksum_encode(bytes.fromhex(addrstr[:]))) test('0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed')
test('0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359')
test('0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB')
test('0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb')

注意:v = utils.big_endian_to_int(utils.sha3(addr.hex()))

所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;比如1234,如果是数字的话应该从低位开始读4321(即小端模式);但是这里为大端模式,所以读法就是1234。这是为了顺序处理addr的hash值

In English, convert the address to hex, but if the ith digit is a letter (ie. it's one of abcdef) print it in uppercase if the 4*ith bit of the hash of the lowercase hexadecimal address is 1 otherwise print it in lowercase.

Rationale

Benefits:

  • Backwards compatible with many hex parsers that accept mixed case, allowing it to be easily introduced over time
  • Keeps the length at 40 characters。 address长度为40个字符
  • On average there will be 15 check bits per address, and the net probability that a randomly generated address if mistyped will accidentally pass a check is 0.0247%. This is a ~50x improvement over ICAP, but not as good as a 4-byte check code.  上面bit的转换效率没有字节的转化效率快,所以下面实现的是半字节(16进制一字符4bits)形式的转换方法:

例子:

const createKeccakHash = require('keccak');

function toChecksumAddress (address) {
address = address.toLowerCase().replace('0x', '');
console.log(address);
var hash = createKeccakHash('keccak256').update(address).digest('hex');//update就是输入要加密的值,digest就是将加密好的hash值以16进制的形式输出
console.log(hash);//5cfac663f45837b409c4d3dc1cef5f4759734f4989dd53a31b1265734c0b28f4,64个
var ret = '0x'; for (var i = ; i < address.length; i++) {//所以只用得到hash的前40个字符
if (parseInt(hash[i], ) >= ) {//即将16进制的hash[i]转化成10进制的数值后与8进行比较,如果在i位置的hash的值大于或等于8,相应位置的address的值就换成大写,否则就还是小写
ret += address[i].toUpperCase();//其实就是根据得到的hash值来相应将address转换成大小写皆有的形式
console.log('if');
console.log(ret);
} else {
ret += address[i];
console.log('else');
console.log(ret);
}
} return ret;
} var addr = '0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359';//去掉0x是40个
console.log(toChecksumAddress(addr));

这里的例子address是16进制的,当然,如果the hex address encoded as ASCII,那么就写成:

var hash = createKeccakHash('keccak256').update(Buffer.from(address.toLowerCase(), 'ascii')).digest()

Adoption

Wallet displays checksummed addresses rejects invalid mixed-case rejects too short rejects too long
Etherwall 2.0.1 Yes Yes Yes Yes
Jaxx 1.2.17 No Yes Yes Yes
MetaMask 3.7.8 Yes Yes Yes Yes
Mist 0.8.10 Yes Yes Yes Yes
MyEtherWallet v3.9.4 Yes Yes Yes Yes
Parity 1.6.6-beta (UI) Yes Yes Yes Yes

Exchange support for mixed-case address checksums, as of 2017-05-27:

Exchange displays checksummed deposit addresses rejects invalid mixed-case rejects too short rejects too long
Bitfinex No Yes Yes Yes
Coinbase Yes No Yes Yes
GDAX Yes Yes Yes Yes
Kraken No No Yes Yes
Poloniex No No Yes Yes
Shapeshift No No Yes Yes

References

  1. EIP 55 issue and discussion https://github.com/ethereum/eips/issues/55
  2. Python implementation in ethereum-utils
  3. Ethereumjs-util implementation https://github.com/ethereumjs/ethereumjs-util/blob/75f529458bc7dc84f85fd0446d0fac92d991c262/index.js#L452-L466
/**
* Returns a checksummed address
* @param {String} address
* @return {String}
*/
exports.toChecksumAddress = function (address) {
address = exports.stripHexPrefix(address).toLowerCase()
var hash = exports.sha3(address).toString('hex')
var ret = '0x' for (var i = ; i < address.length; i++) {
if (parseInt(hash[i], ) >= ) {
ret += address[i].toUpperCase()
} else {
ret += address[i]
}
} return ret
}

  4.Swift implementation in EthereumKit

ethereum/EIPs-55 Mixed-case checksum address encoding的更多相关文章

  1. 【转】干货 | 【虚拟货币钱包】从 BIP32、BIP39、BIP44 到 Ethereum HD Wallet

    虚拟货币钱包 钱包顾名思义是存放$$$.但在虚拟货币世界有点不一样,我的帐户资讯(像是我有多少钱)是储存在区块链上,实际存在钱包中的是我的帐户对应的 key.有了这把 key 我就可以在虚拟货币世界证 ...

  2. ethereum/EIPs-1271 smart contract

    https://github.com/PhABC/EIPs/blob/is-valid-signature/EIPS/eip-1271.md Standard Signature Validation ...

  3. ethereum/EIPs-1078 Universal login / signup using ENS subdomains

    https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1078.md eip title author discussions-to status ...

  4. Ethereum HD Wallet(虚拟货币钱包)-BIP32、BIP39、BIP44

    1.使用HD钱包的好处(链接:https://www.jianshu.com/p/53405db83c16) 备份更容易 传统钱包的问题是一个钱包可能存有一堆密钥地址,每个地址都有一些比特币.这样备份 ...

  5. go ethereum源码分析 PartIV Transaction相关

    核心数据结构: core.types.transaction.go type Transaction struct { data txdata // caches hash atomic.Value ...

  6. ethereum/EIPs-100 挖矿难度计算

    https://github.com/ethereum/EIPs/blob/master/EIPS/eip-100.md 创世纪区块的难度是131,072,有一个特殊的公式用来计算之后的每个块的难度. ...

  7. ethereum/EIPs-191 Signed Data Standard

    https://github.com/ethereum/EIPs/blob/master/EIPS/eip-191.md eip title author status type category c ...

  8. ethereum/EIPs-161 State trie clearing

    EIP 161: State trie clearing - makes it possible to remove a large number of empty accounts that wer ...

  9. ethereum/EIPs-725

    https://github.com/ethereum/EIPs/blob/master/EIPS/eip-725.md eip title author discussions-to status ...

随机推荐

  1. Extjs 项目中常用的小技巧,也许你用得着(2)

    接着来,也是刚刚遇到的 panel怎么进行收缩 collapsible: true, 这会panel就会出现这个 点这个就可以收缩了 panel怎么随便拉伸,也就是让那个小黑三角出现 split: t ...

  2. Mapreduce的api编程

    KEYIN:输入的KEY是maptask所读取到的一行文本的起始偏移量,longVALUEIN:输入的VALUE的类型,输入的VALUE是maptask所读取到的一行文本内容,StringKEYOUT ...

  3. 【RabbitMQ】2、心得总结,资料汇总

    Spring AMQP中文文档 http://ju.outofmemory.cn/entry/320538 云栖社区    https://yq.aliyun.com/search?q=rabbitm ...

  4. IIS7下,显示PHP错误(不显示500错误,而显示详细错误)

    玛德,IIS就是个坑,害得老子进行摸索了那么久,才找到了解决方法: 1.除了将php.ini配置为: display_errors = on; error_reporting = E_ALL & ...

  5. 【读书笔记】iOS-基带攻击

    一,iOS设备中的蜂窝网络通信栈运行在专门的芯片上,这个芯片就是数字基带处理器. 参考资料:<黑客攻防技术宝典-iOS实战篇>

  6. JS性能优化 之 文档片段 createDocumentFragment

    我们用原生JS进行开发时,经常会用到两种更新DOM节点的方法:innerHTML 和 appendChild() .其中 innerHTML 会完全替换掉原先的节点内容,如果我们是想向元素追加子节点的 ...

  7. TUM数据集rgbd_benchmark工具的使用方法

    # 在学习视觉slam过程中,需要对数据集合进行预处理和对slam或者跟踪结果进行评价,TUM提供一组这样的工具,为了自己以后方便查找,于是把它记录下来 一.RGBD_Benchmark工具下载链接: ...

  8. loadrunner 脚本优化-加密与解密

    脚本优化-加密与解密 by:授客 QQ:1033553122   密码加密 可以给密码加密,意在把结果字符串作为脚本的参数或者参数值.例如,完整可能有一个用户密码填写的表单,你想测试网站针对不同密码的 ...

  9. [OTA] 系统加密后Recovery是如何读取OTA升级包的

    目前很多Android手机采用的FUSE方案,也就是内部SD卡不单独占用一个文件系统而实际上占用的是userdata的空间. 当系统加密后,解密需要VOLD的参于.而在Recovery模式下,是没有V ...

  10. etcd raft如何实现leadership transfer

    leadership transfer可以把raft group中的leader身份转给其中一个follower.这个功能可以用来做负载均衡,比如可以把leader放在性能更好的机器或者离客户端更近的 ...