首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么web3发送不需要私钥或签名

为什么web3发送不需要私钥或签名
EN

Ethereum用户
提问于 2018-09-02 17:17:05
回答 3查看 1.7K关注 0票数 2

我正在构建一个ERC20 smart contract,它将通过node.jsweb3库进行访问。我看到web3.eth.Contractsend函数,它接受参数from,该参数在智能契约中映射到msg.sender。就我所理解的(以及我的调试支持)而言,我可以将from字段更改为几乎任何地址,这样就可以绕过契约的业务逻辑,例如

代码语言:javascript
复制
token.methods.method_only_owner_can_activate(<some_data>).send({ from: <contract_owner_address>, <gas> });

甚至把主人:

代码语言:javascript
复制
token.methods.setOwner(<my_not_owner_address>).send({ from: <contract_owner_address>, <gas> });

因为地址应该是公开的,所以任何用户都可以创建一个进程来模仿这个行为,并绕过我的安全逻辑。

还有其他方法确实与private key签署了事务,但是send方法是开放的,可以绕过业务逻辑,这似乎是一个很大的安全问题。

因为我错过了什么?

EN

回答 3

Ethereum用户

回答已采纳

发布于 2018-09-02 17:24:48

任何事务到实际的Ethereum区块链都需要用私钥签名。

要使上面的代码工作(只是提供一个from地址),连接到的节点必须为您进行签名。只要from地址在该节点中是“未锁定的”(测试网络(如ganache )下的默认地址,或者使用普通节点(如geth或奇偶校验)显式完成的默认地址),它就能够使用该密钥对事务进行签名并发送。

在现实世界中,你的应用程序的用户不会连接到一个拥有私钥的节点,所以这不是一个问题。

票数 2
EN

Ethereum用户

发布于 2018-09-02 17:32:36

web3库创建需要由from中指定的帐户签名的事务。它是通过与拥有该帐户私钥的本地节点(该节点拥有该帐户的私钥并目前已将其解锁)进行签名的,或者由一款软件(如Metamask )进行签名,该软件控制该私钥,并仅在用户确认时签署交易。

没有from字段中帐户的私钥,就不可能发送有效(签名)事务。

票数 2
EN

Ethereum用户

发布于 2018-09-02 17:24:27

msg.sender属性不能伪造--至少有人不能用msg.sender创建一个事务,而该事务不是他们拥有的地址。

无论您在合同中有什么安全措施,您都可以依赖于这样一个事实,即msg.sender地址是进行事务的人。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/57934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档