以太坊 r,s,v是什么,以及怎么实现的

一:什么是r,s,v

1):vr,s是交易签名的值。它们可以用作获取任何以太坊帐户的公钥

2):rs是ECDSA 签名的输出,v是恢复 ID

3):v是怎么来的呢?
    ①简单理解V
            偶数r,我们得到v = 27,奇数r我们得到v = 28

 ②其他理解
    v
需要为签名恢复正确的公钥,因为有时(即使概率很低)签名可以检索多个有效公钥。
     这是一个备忘单:

  • 27未压缩的公钥,y-parity 0,幅度x低于曲线阶数
  • 28未压缩的公钥,y-parity 1,幅度x低于曲线阶数
  • 29未压缩的公钥,y-parity 0,幅度x 大于曲线阶
  • 30未压缩的公钥,y-parity 1,幅度x 大于曲线阶
  • 31 压缩公钥,y-parity 0,幅度x低于曲线阶
  • 32 压缩公钥,y-parity 1,幅度x低于曲线阶
  • 33 压缩公钥,y-parity 0,幅度x 大于曲线阶
  • 34 压缩公钥,y-parity 1,幅度x 大于曲线阶

对于v >= 35您可能正在按照EIP-155处理以太坊签名的任何人:

v = recovery_id + CHAIN_ID * 2 + 35 链接:signature - ECDSA: (v, r, s), what is v? - Bitcoin Stack Exchange

既然对 r,s,v有了简单理解,我们接下来看代码怎么实现

二:代码部分如何获取r, s,v

1)现有的工具包直接用

   ethereumjs-util 

 然后我们看怎么直接使用这个工具包

var { fromRpcSig } = require('ethereumjs-util');

 const sig = fromRpcSig(sig);  //sig是签名之后的字符串,不知道怎么签名消息或数据的会单独一篇文章讲


 var r = '0x' + sig.r.toString('hex');   //这里为了方便输出,我们分别把他们转成了16进制字符串
 var s = '0x' + sig.s.toString('hex');
 var v = sig.v;
 console.log("r:", r, "s: ", s, "v: ", v);

 接下来我们看 ethereumjs-util 中 fromRpcSig 方法是怎么实现的
ethereumjs-util/signature.ts at master · ethereumjs/ethereumjs-util · GitHub
 

/**
 * Convert signature format of the `eth_sign` RPC method to signature parameters
 * NOTE: all because of a bug in geth: https://github.com/ethereum/go-ethereum/issues/2053
 */
export const fromRpcSig = function (sig: string): ECDSASignature {
  const buf: Buffer = toBuffer(sig)

  let r: Buffer
  let s: Buffer
  let v: number
  if (buf.length >= 65) {
    r = buf.slice(0, 32)
    s = buf.slice(32, 64)
    v = bufferToInt(buf.slice(64))
  } else if (buf.length === 64) {
    // Compact Signature Representation (https://eips.ethereum.org/EIPS/eip-2098)
    r = buf.slice(0, 32)
    s = buf.slice(32, 64)
    v = bufferToInt(buf.slice(32, 33)) >> 7
    s[0] &= 0x7f
  } else {
    throw new Error('Invalid signature length')
  }

  // support both versions of `eth_sign` responses
  if (v < 27) {
    v += 27
  }

  return {
    v,
    r,
    s,
  }
}

到此我们就简单介绍了以太坊中的 r,s,v,如何获取和实现原理,下篇文章我们将讲以太坊签名
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以太坊数据持久化是指将以太坊区块链网络中的数据永久地存储在磁盘或其他持久性存储介质上,以确保数据的长期保存和可访问性。 在以太坊区块链上,每个交易和区块都包含一系列数据,如交易信息、账户余额、智能合约代码等。这些数据需要被保存下来,以便节点能够验证和重放交易,以及构建整个区块链历史记录。 数据持久化的过程包括以下几个方面: 1. 数据写入:当交易被确认后,相关的数据会被写入到磁盘或其他持久性存储介质中。这通常是通过将数据存储在节点的数据库或文件系统中来实现的。 2. 数据索引:为了方便查询和检索数据,节点可能会对存储的数据进行索引。这可以加快数据的访问速度,并提供更高效的数据检索功能。 3. 数据同步:当节点加入或重新连接到以太坊网络时,它需要从其他节点同步最新的区块数据。这涉及到从其他节点下载区块数据并将其存储在本地,以保持节点的数据与整个网络的一致性。 4. 数据备份:为了防止数据丢失或损坏,节点可能会进行定期的数据备份。这可以通过创建数据的副本或使用分布式存储技术来实现,以确保在发生故障或意外情况时能够快速恢复数据。 通过数据持久化,以太坊的交易历史记录和状态可以得到长期保存,并且节点能够在需要时访问和使用这些数据。这对于确保区块链网络的安全性、可用性和可靠性至关重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北纬32.6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值