Устаревшие значения восстановления (V) в сигнатурах Ethereum - PullRequest
0 голосов
/ 01 ноября 2018

Подписи Ethereum должны соответствовать значениям R, S и V кривой secp256k1, при этом значение V должно быть либо 27, либо 28.

Мне было интересно, в чем причина двух действительных значений V?

Это было вызвано классическим хардфорком Эфириума? Используют ли текущие реализации кошелька только одну из них, а другая - это унаследованная ценность?

См .: https://github.com/ethereum/go-ethereum/blob/55599ee95d4151a2502465e0afc7c47bd1acba77/internal/ethapi/api.go#L452-L459

// EcRecover returns the address for the account that was used to create the signature.
// Note, this function is compatible with eth_sign and personal_sign. As such it recovers
// the address of:
// hash = keccak256("\x19Ethereum Signed Message:\n"${message length}${message})
// addr = ecrecover(hash, signature)
//
// Note, the signature must conform to the secp256k1 curve R, S and V values, where
// the V value must be be 27 or 28 for legacy reasons.
//
// https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_ecRecover
func (s *PrivateAccountAPI) EcRecover(ctx context.Context, data, sig hexutil.Bytes) (common.Address, error) {
    if len(sig) != 65 {
        return common.Address{}, fmt.Errorf("signature must be 65 bytes long")
    }
    if sig[64] != 27 && sig[64] != 28 {
        return common.Address{}, fmt.Errorf("invalid Ethereum signature (V is not 27 or 28)")
    }
    sig[64] -= 27 // Transform yellow paper V from 27/28 to 0/1

    rpk, err := crypto.Ecrecover(signHash(data), sig)
    if err != nil {
        return common.Address{}, err
    }
    pubKey := crypto.ToECDSAPub(rpk)
    recoveredAddr := crypto.PubkeyToAddress(*pubKey)
    return recoveredAddr, nil
}

1 Ответ

0 голосов
/ 02 ноября 2018

R и S недостаточно для восстановления открытого ключа подписавшего. V предоставляет дополнительную информацию, необходимую для устранения неоднозначности. Смотри https://ethereum.stackexchange.com/questions/15766/what-does-v-r-s-in-eth-gettransactionbyhash-mean.

...