- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试使用 geth golang 库验证从客户端传入的签名。我从我的一个 cryptokitties 帐户中获取示例数据(签名/地址)(我可以在请求中看到它)。如果我将 blow 凭据粘贴到 https://etherscan.io/verifySig 中,它会得到验证,所以我知道参数是正确的。
我的代码:
import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
)
sig := 0x80f5bac5b6300ed64835d5e2f167a368c892ccc2d0e252bc84befbcb093f5a2d36294b95d86683cec778c8c796049933c04c71576c56c1d6e9a9fa10342beca31c
data := "Cryptokitties"
decoded = hexutil.MustDecode(sig) // j8aUTtPid0ZnNa/s4Ef5gisYYh1bCeLSmFrtJtDjNRRqxShUr+1A3BVgoAPwiZ+lKN0POB1JOdVhVHI9tcHmABs=
hash := crypto.Keccak256([]byte(data)) // "ljQQTm25oqIbD+LMl70aRUcTzXCeeDGfkRj9YJYsgKY="
pubKey, err := crypto.Ecrecover(hash, sig) // error: "invalid signature recovery id"
我确定我遗漏了一些简单的东西,但不确定去哪里找。
**更新
在查看了一些答案后我尝试了什么:
像这样更改消息:fmt.Sprintf("\u0019Ethereum 签名消息:\n%d%s", len(data), data)
//"\u0019Ethereum 签名消息:\n13Cryptokitties"
在散列之前对消息进行十六进制编码:data=hexutil.Encode(数据)
结合以上两者,所以首先添加“以太坊签名消息”,然后对其进行十六进制编码。
如有任何意见,我将不胜感激,我确定这是一个菜鸟问题。
**更新
查看源码,发现它期望的recovery id大于4:sig[64] >= 4
在我的例子中,结果是 27:sig[64] --> 27
最佳答案
// 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
}
这是我的要点:https://gist.github.com/dcb9/385631846097e1f59e3cba3b1d42f3ed#file-eth_sign_verify-go
关于go - Geth ecrecover 无效签名恢复id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49085737/
我想用 Docker 创建私有(private)以太坊网络。我已经准备好了 genesis 文件,所以我需要 geth init genesis.json 然后像 geth --mine ... 一样
我正在使用这本书开始区块链开发 掌握区块链 - 深入了解分布式账本、共识协议(protocol)、智能合约、DApp、加密货币、以太坊 , 我正在使用带有 geth 版本 1.10.9 的 WSL。
我正在尝试使用 geth golang 库验证从客户端传入的签名。我从我的一个 cryptokitties 帐户中获取示例数据(签名/地址)(我可以在请求中看到它)。如果我将 blow 凭据粘贴到 h
我已经在 ubuntu 中安装了 Solidity 编译器(solc)。 无法链接 solc至Geth . 我们应该怎么做? 以下是我已经完成的步骤: sudo add-apt-repository
我正在尝试使用以太坊创建一个私有(private)区 block 链(仅具有一个节点)。我按照这个教程:https://media.consensys.net/how-to-build-a-priva
我正在尝试使用以太坊创建一个私有(private)区 block 链(仅具有一个节点)。我按照这个教程:https://media.consensys.net/how-to-build-a-priva
所以我试图检索我的智能合约生成的事件 var abi = [{ "constant": false, "inputs": [{ "name": "_value", "type"
当我想获得 numpy 数组的伴随值时,我必须输入 A = np.matrix([...]) A.getH() 我对命名很好奇。这是为什么 np.matrix.getH()? 相比之下,转置和共轭实现
我想在一个网络中的不同计算机上设置一个私有(private)的以太坊测试网。 我有我的私有(private)计算机,其 web3.py 实现已连接到 Ganachi 测试网。我可以在我的程序中使用 s
我的本地以太坊网络上的交易有问题 - 在某些时候,交易挂起并从我的账户中花费大量 ETH。 这是一个示例代码: async function send(toAccount, weiVal) {
我是 Ethereum 的新手通常到blockchain .我了解到以太坊区 block 链在 Kademlia 上运行. Eleuth P2P 很好地解释了分布式哈希表及其工作原理. 现在我用了ge
我创建了一个以太坊地址 geth account new 并向它发送了一些乙醚。然后我运行服务器: geth 和 JavaScript 控制台: geth attach 我检查了余额,但它是0: >
使用 debug_traceCall 时,我得到了执行期间所有操作码和状态变化的低级 EVM 跟踪。这个太详细了。当我使用默认的 callTracer 时,我可以获得更好的调用树。但是,无论哪种方式,
在 Windows 10 上,在我的命令提示符下,我去 > geth --rinkeby 哪个开始将我的节点与网络同步 在另一个命令提示符下,我去 > geth --rinkeby 附加 ipc:\\
github 上的文档说: --allow-insecure-unlock Allow insecure account unlocking when account-related RPCs are
我想知道为什么打印以下代码: Beta 44 44 44 请纠正我,因为我的分析显然不正确,但我无法弄清楚原因。 b.h 首先被调用,它是 44,然后调用 b.getH() 并打印“Beta 44”。
我在Windows上尝试通过rinkeby连接到以太坊Testnet。 我下载了geth 1.8.2和以太坊钱包0.9.3 我给第一个命令是: geth --rinkeby --fast --cach
我似乎无法获得最新版本的Geth 1.8.3。它停止并且永远不会开始同步。 我正在尝试将其连接到rinkeby.io测试网进行智能合约测试。 下载并使用ADD将文件复制到镜像后,我在1.7.3上取得了
我正在尝试使用 Puppeth(如 Péter Szilágyi demoed in Ethereum devcon three 2017)设置私有(private)以太坊测试网络。我在 macboo
我使用 geth 创建了一个专用网络。并从 remix(浏览器)部署合约。它显示以下错误。 genesis.json 就是这个。 { "config": { "homesteadBlo
我是一名优秀的程序员,十分优秀!