web3.js与solidity的交互

本文详细介绍了如何使用web3.js库与以太坊的solidity智能合约进行交互,包括环境搭建、Web3 Provider的设置、实例化Web3.js、调用合约函数(call和send)、监听事件等关键步骤。通过实例展示了如何通过Metamask与用户的以太坊账户连接,以及如何处理读取和修改区块链数据,为开发以太坊DApp提供了实用的指导。
摘要由CSDN通过智能技术生成

web3.js

介绍

以太坊网络是由节点组成的,每一个节点都包含了区块链的一份拷贝。当你想要调用一份智能合约的一个方法,你需要从其中一个节点中查找并告诉它:

1.智能合约的地址
2.你想调用的方法,以及
3.你想传入那个方法的参数
以太坊节点只能识别一种叫做 JSON-RPC 的语言。这种语言直接读起来并不好懂。当你你想调用一个合约的方法的时候,需要发送的查询语句将会是这样的:

{
   "jsonrpc":"2.0","method":"eth_sendTransaction","params":[{
   "from":"0xb60e8dd61c5d32be8058bb8eb970870f07233155","to":"0xd46e8dd67c5d32be8058bb8eb970870f07244567","gas":"0x76c0","gasPrice":"0x9184e72a000","value":"0x9184e72a","data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"}],"id":1}

幸运的是 Web3.js 把这些令人讨厌的查询语句都隐藏起来了, 所以你只需要与方便易懂的 JavaScript 界面进行交互即可。

你不需要构建上面的查询语句,在你的代码中调用一个函数看起来将是这样:

CryptoZombies.methods.createRandomZombie("Vitalik Nakamoto 🤔")
  .send({
    from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155", gas: "3000000" })

web3.js环境搭建

方式一:可以用一些常用工具把 Web3.js 添加进来:

// 用 NPM
npm install web3

// 用 Yarn
yarn add web3

// 用 Bower
bower install web3

// ...或者其他。

方式二:可以从 github 直接下载压缩后的 .js 文件 然后包含到你的项目文件中:

Web3 Provider(Web3的提供者)

节点

要记住,以太坊是由共享同一份数据的相同拷贝的 节点 构成的。 在 Web3.js 里设置 Web3 的 Provider(提供者) 告诉我们的代码应该和 哪个节点 交互来处理我们的读写。这就好像在传统的 Web 应用程序中为你的 API 调用设置远程 Web 服务器的网址。

你可以运行你自己的以太坊节点来作为 Provider。 不过,有一个第三方的服务,可以让你的生活变得轻松点,让你不必为了给你的用户提供DApp而维护一个以太坊节点— Infura.

Infura-节点提供者

Infura(https://infura.io/) 是一个服务,它维护了很多以太坊节点并提供了一个缓存层来实现高速读取。你可以用他们的 API 来免费访问这个服务。 用 Infura 作为节点提供者,你可以不用自己运营节点就能很可靠地向以太坊发送、接收信息。
你可以通过这样把 Infura 作为你的 Web3 节点提供者:

var web3 = new Web3(new Web3.providers.WebsocketProvider("wss://mainnet.infura.io/ws"));

不过,因为我们的 DApp 将被很多人使用,这些用户不单会从区块链读取信息,还会向区块链 入信息,我们需要用一个方法让用户可以用他们的私钥给事务签名。

注意: 以太坊 (以及通常意义上的 blockchains )使用一个公钥/私钥对来对给事务做数字签名。把它想成一个数字签名的异常安全的密码。这样当我修改区块链上的数据的时候,我可以用我的公钥来 证明 我就是签名的那个。但是因为没人知道我的私钥,所以没人能伪造我的事务。

加密学非常复杂,所以除非你是个专家并且的确知道自己在做什么,你最好不要在你应用的前端中管理你用户的私钥。
不过幸运的是,你并不需要,已经有可以帮你处理这件事的服务了: Metamask.

Metamask

Metamask(https://metamask.io/)是 Chrome 和 Firefox 的浏览器扩展, 它能让用户安全地维护他们的以太坊账户和私钥, 并用他们的账户和使用 Web3.js 的网站互动(如果你还没用过它,你肯定会想去安装的——这样你的浏览器就能使用 Web3.js 了,然后你就可以和任何与以太坊区块链通信的网站交互了)

作为开发者,如果你想让用户从他们的浏览器里通过网站和你的DApp交互(就像我们在 CryptoZombies 游戏里一样),你肯定会想要兼容 Metamask 的。

注意: Metamask 默认使用 Infura 的服务器做为 web3 提供者。 就像我们上面做的那样。不过它还为用户提供了选择他们自己 Web3 提供者的选项。所以使用 Metamask 的 web3 提供者,你就给了用户选择权,而自己无需操心这一块。

使用 Metamask 的 web3 提供者

Metamask 把它的 web3 提供者注入到浏览器的全局 JavaScript对象web3中。所以你的应用可以检查 web3 是否存在。若存在就使用 web3.currentProvider 作为它的提供者。

这里是一些 Metamask 提供的示例代码,用来检查用户是否安装了MetaMask,如果没有安装就告诉用户需要安装MetaMask来使用我们的应用。

window.addEventListener('load', function() {
   

  // 检查web3是否已经注入到(Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
   
    // 使用 Mist/MetaMask 的提供者
    web3js = new Web3(web3.currentProvider);
  } else {
   
    // 处理用户没安装的情况, 比如显示一个消息
    // 告诉他们要安装 MetaMask 来使用我们的应用
  }

  // 现在你可以启动你的应用并自由访问 Web3.js:
  startApp()

})

你可以在你所有的应用中使用这段样板代码,好检查用户是否安装以及告诉用户安装 MetaMask。

注意: 除了MetaMask,你的用户也可能在使用其他他的私钥管理应用,比如 Mist 浏览器。不过,它们都实现了相同的模式来注入 web3 变量。所以我这里描述的方法对两者是通用的。

现在,我们已经用 MetaMask 的 W

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Web3.js与多签钱包进行交互,你需要完成以下步骤: 1. 部署多签钱包智能合约 首先,你需要使用Solidity语言编写多签钱包智能合约并部署到以太坊网络中。你可以使用Remix等Solidity集成开发环境来编写和测试智能合约代码,也可以使用Truffle等工具来实现智能合约的自动化部署和测试。 2. 获取多签钱包合约实例 在Web3.js中,你可以通过以下代码获取多签钱包智能合约的实例: ```javascript const web3 = new Web3(provider); const contract = new web3.eth.Contract(abi, contractAddress); ``` 其中,`provider`表示以太坊节点提供者,`abi`表示多签钱包智能合约的ABI,`contractAddress`表示多签钱包智能合约的地址。 3. 创建交易 在多签钱包中,每个交易都需要经过多个账户的签名才能执行。因此,在创建交易时,你需要指定交易的目标地址、转账金额等信息,并将交易发送给多签钱包智能合约进行签名和执行。 以下是一个简单的创建交易的示例代码: ```javascript const transaction = { from: senderAddress, to: targetAddress, value: amount }; const encodedTransaction = contract.methods.submitTransaction(targetAddress, amount, data).encodeABI(); const result = await contract.methods.submitTransaction(targetAddress, amount, data).send({ from: senderAddress, gas: 1000000 }); const transactionId = result.events.Submission.returnValues.transactionId; ``` 在这个示例中,我们首先创建了一个交易对象`transaction`,其中包含了交易的发送者地址、目标地址、转账金额等信息。然后,我们使用`encodeABI()`函数将交易对象编码为字节码。接下来,我们使用`send()`函数将交易发送给多签钱包智能合约进行签名和执行,其中指定了发送者地址`from`和交易执行所需的最大Gas限制`gas`。如果交易执行成功,我们将会收到一个包含交易ID的事件。 4. 签名交易 在多签钱包中,每个交易都需要经过多个账户的签名才能执行。因此,在创建交易后,你需要将交易发送给其他参与者进行签名,并将签名后的交易再次发送给多签钱包智能合约进行执行。 以下是一个简单的签名交易的示例代码: ```javascript const encodedTransaction = contract.methods.submitTransaction(targetAddress, amount, data).encodeABI(); const result = await contract.methods.approveTransaction(transactionId).send({ from: signerAddress, gas: 1000000 }); const isConfirmed = result.events.Confirmation.returnValues.confirmed; ``` 在这个示例中,我们使用`approveTransaction()`函数对指定的交易进行签名,并将签名后的交易发送给多签钱包智能合约进行执行。如果签名成功,我们将会收到一个包含签名信息的事件。 需要注意的是,由于多签钱包涉及到多个账户的资产管理,因此在设计和实现多签钱包时需要格外小心,以避免出现安全漏洞或其他问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值