20
已解决

为什么以太坊地址中没有校验值?

zhuoji 船员 发布在 问答/互助
 17102  4
比特币地址中使用校验值,主要是为了避免向输入有误或是无效的地址的转账。
为什么以太坊地址中没有校验值?是不是编程人员的疏忽啊?以后推出的版本中会不会改进?


最佳答案
阿爬队长
2016-03-29 11:35:10
为什么以太坊地址中没有校验值?这是因为所谓的“以太坊地址”,也就是原始的16进制字符串中并无校验值信息。就拿比特币举个例子,你给某个比特币地址发送交易,1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3,实际的交易信息中并不包括“1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3”这个字符串,而是用“ 0xfc916f213a3d7f1369313d5fa30f6168f9446a2d”表示,这是它真正的地址,这个原始的用16进制字符串表示的地址中并不包含校验值信息,也没有版本号。事实上,有了原始表示地址的字符串,以太坊也完全可以做到像比特币那样,用BASE58编码出一个包含校验值和版本号的地址,这个地址完全不影响以太坊的使用。但是Vitalik本人曾提到过不必这么做的原因,表达以太坊原始地址有一个更具特色的方法,叫作ICAP协议,看上去就是“XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS”,这种协议使用的字母数字字符的范围更大,可以节省空间。还有ICAP协议是一个有效的国际银行账户号码(IBAN),银行软件可以读取并与之通信。另外,2016年2月,Vitalik推出了一个过渡性校验方法。
  • 正序
  • 最新
只看帖主 楼层直达
  • 阿爬 队长 2016-03-29 11:35:10 只看该作者 地板
    为什么以太坊地址中没有校验值? 这是因为所谓的“以太坊地址”,也就是原始的16进制字符串中并无校验值信息。
    就拿比特币举个例子,你给某个比特币地址发送交易, 1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3,实际的交易信息中并不包括“1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3”这个字符串,而是用“ 0xfc916f213a3d7f1369313d5fa30f6168f9446a2d”表示,这是它真正的地址,这个原始的用16进制字符串表示的地址中并不包含校验值信息,也没有版本号。
    事实上,有了原始表示地址的字符串,以太坊也完全可以做到像比特币那样,用BASE58编码出一个包含校验值和版本号的地址,这个地址完全不影响以太坊的使用。 但是Vitalik本人曾提到过不必这么做的原因,表达以太坊原始地址有一个更具特色的方法,叫作ICAP协议,看上去就是“XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS”,这种协议使用的字母数字字符的范围更大,可以节省空间。还有ICAP协议是一个有效的国际银行账户号码(IBAN),银行软件可以读取并与之通信。
    另外,2016年2月,Vitalik推出了一个过渡性校验方法。
  • 510685947 副船长 2016-03-29 12:16:09 只看该作者 沙发
    以太坊的消息在某种程度上类似于比特币的交易,但是两者之间存在三点重要的不同。第一,以太坊的消息可以由外部实体或者合约创建,然而比特币的交易只能从外部创建。第二,以太坊消息可以选择包含数据。第三,如果以太坊消息的接受者是合约账户,可以选择进行回应,这意味着以太坊消息也包含函数概念。
    以太坊中“交易”是指存储从外部账户发出的消息的签名数据包。交易包含消息的接收者、用于确认发送者的签名、以太币账户余额、要发送的数据和两个被称为STARTGAS和GASPRICE的数值。为了防止代码的指数型爆炸和无限循环,每笔交易需要对执行代码所引发的计算步骤-包括初始消息和所有执行中引发的消息-做出限制。STARTGAS就是限制,GASPRICE是每一计算步骤需要支付矿工的费用。如果执行交易的过程中,“用完了燃料”,所有的状态改变恢复原状态,但是已经支付的交易费用不可收回了。如果执行交易中止时还剩余燃料,那么这些燃料将退还给发送者。创建合约有单独的交易类型和相应的消息类型;合约的地址是基于账号随机数和交易数据的哈希计算出来的。
    消息机制的一个重要后果是以太坊的“头等公民”财产-合约与外部账户拥有同样权利,包括发送消息和创建其它合约的权利。这使得合约可以同时充当多个不同的角色,例如,用户可以使去中心化组织(一个合约)的一个成员成为一个中介账户(另一个合约),为一个偏执的使用定制的基于量子证明的兰波特签名(第三个合约)的个人和一个自身使用由五个私钥保证安全的账户(第四个合约)的共同签名实体提供居间服务。以太坊平台的强大之处在于去中心化的组织和代理合约不需要关心合约的每一参与方是什么类型的账户。
    以太坊状态转换函数
    state2
    以太坊的状态转换函数:APPLY(S,TX) -> S’,可以定义如下:
    1. 检查交易的格式是否正确(即有正确数值)、签名是否有效和随机数是否与发送者账户的随机数匹配。如否,返回错误。
    2. 计算交易费用:fee=STARTGAS * GASPRICE,并从签名中确定发送者的地址。从发送者的账户中减去交易费用和增加发送者的随机数。如果账户余额不足,返回错误。
    3. 设定初值GAS = STARTGAS,并根据交易中的字节数减去一定量的燃料值。
    4. 从发送者的账户转移价值到接收者账户。如果接收账户还不存在,创建此账户。如果接收账户是一个合约,运行合约的代码,直到代码运行结束或者燃料用完。
    5. 如果因为发送者账户没有足够的钱或者代码执行耗尽燃料导致价值转移失败,恢复原来的状态,但是还需要支付交易费用,交易费用加至矿工账户。
    6. 否则,将所有剩余的燃料归还给发送者,消耗掉的燃料作为交易费用发送给矿工。
    例如,假设合约的代码如下:
    if !contract.storage[msg.data[0]]:
    contract.storage[msg.data[0]] = msg.data[1]
    需要注意的是,在现实中合约代码是用底层以太坊虚拟机(EVM)代码写成的。上面的合约是用我们的高级语言Serpent语言写成的,它可以被编译成EVM代码。假设合约存储器开始时是空的,一个值为10以太,燃料为2000,燃料价格为0.001以太并且两个数据字段值为[ 2, 'CHARLIE' ] [3]的交易发送后,状态转换函数的处理过程如下:
    1. 检查交易是否有效、格式是否正确。
    2. 检查交易发送者至少有2000*0.001=2个以太币。如果有,从发送者账户中减去2个以太币。
    3. 初始设定gas=2000,假设交易长为170字节,每字节的费用是5,减去850,所以还剩1150。
    4. 从发送者账户减去10个以太币,为合约账户增加10个以太币。
    5. 运行代码。在这个合约中,运行代码很简单:它检查合约存储器索引为2处是否已使用,注意到它未被使用,然后将其值置为CHARLIE。假设这消耗了187单位的燃料,于是剩余的燃料为1150 – 187 = 963。
    6. 向发送者的账户增加963*0.001=0.963个以太币,返回最终状态。
    如果没有合约接收交易,那么所有的交易费用就等于GASPRICE乘以交易的字节长度,交易的数据就与交易费用无关了。另外,需要注意的是,合约发起的消息可以对它们产生的计算分配燃料限额,如果子计算的燃料用完了,它只恢复到消息发出时的状态。因此,就像交易一样,合约也可以通过对它产生的子计算设置严格的限制,保护它们的计算资源。 来源:http://www.8btc.com/ethereumwhitepaper
  • 玛_雅 版主 2016-04-12 12:15:30 来自App 只看该作者 5楼
    Russell提出新的比特币地址建议,是这样的:
    “btc:ybndrfg8ejkmcpqxot1uwisza345h769ybndrrfg (41 digits for a P2WPKH)”
    Dashjr对其进行了批评。
    我也觉得没有必要换。 1,有大小写可以缩短长度。 2,以1开头作为表识即可,而以“btc:”作为开头一方面太长,另外还涉及“:”是否全角半角。 3,现在的比特地址已经具有校验。错位不会通过。反而以太地址是无法怎么错,只要位数对且为数字和A-F就合法。以太地址才急需改进,而比特币地址没有修改必要。
登录 账号发表你的看法,还没有账号?立即免费 注册