Web3 详解
1. 使用 Web3 库
Web3 是一个 JavaScript 库,可用于通过 RPC 通信与以太坊节点通信。 Web3 的工作方式是,公开已通过 RPC 启用的方法,这允许开发利用 Web3 库的用户界面,以便与部署在区块链上的合约进行交互。
为了通过 Geth 公开这些方法,可以使用以下命令:
[admin@daolian ~]$geth --datadir .ethereum/privatenet/ --networkid 786 --rpc --rpcapi 'web3,net,eth,debug' --rpcport 8001 --rpccorsdomain 'http://localhost:7777'
注意: --rpcapi 标志允许 web3、eth、net 和 debug 方法。 |
这是一个功能强大的库,可以通过附加一个 Geth 示例来进一步探索。
可以使用以下命令附加 geth 示例:
[admin@daolian ~]$geth attach ipc: ~/etherprivate/geth.ipc
一旦 Geth JavaScript 控制台运行,就可以查询 Web3,如下图所示:
1.1 合约部署
可以使用 Geth 部署简单的合约,并通过 Geth 提供的命令行界面 (控制台或附加) 与 Web3 进行交互。先来看以下源代码示例:
progma solidity ^0.4.0^;
contract valueChecker
{
uint price=10;
event valueEvent(bool returnValue);
function Matcher (uint8 x) public returns (bool)
{
if (x>=price)
{
valueEvent(true);
return true;
}
}
}
合约部署的步骤如下:
(1)使用以下命令运行 Geth 客户端:
[admin@daolian ~]$./geth --datadir ~/etherprivate/ --networkid 786 --rpc --rpcapi 'web3,eth,debug,personal' --rpccorsdomain '*'
(2) 打开另一个终端并运行以下命令。如果 Geth 控制台没有运行,则在使用以下命令之后,它应该已经在运行:
[admin@daolian ~]$./geth attach ipc:/Users/drequinox/etherprivate/geth.ipc
(3) 此步骤将需要合约的 Web3 部署,这可以从 Remix 浏览器中获得。
首先,将以下源代码粘贴到 Remix IDE。
progma solidity ^0.4.0^;
contract valueChecker
{
uint price=10;
event valueEvent(bool returnValue);
function Matcher (uint8 x) public returns (bool)
{
if (x>=price)
{
valueEvent(true);
return true;
}
}
}
其次,将代码粘贴到 Remix IDE 后,它将如下图所示:
(4)通过单击 Details (详细信息)按钮复制 Web3 部署脚本,然后将该函数复制到剪贴板。这可以通过在 IDE 中单击 WEB3DEPLOY 标题旁边的 Copy value to clipboard(复制值到剪贴板)图标来实现。 下图显示了 Web3 部署脚本:
(5)确保帐户已解锁且币基设置正确。
首先,使用以下命令查看帐户,该命令输出帐户 0,如下所示:
>personal.listAccounts[0]
"0xcf61d213faa9acabdf0d110e1397caf20445c58f"
其次,使用以下命令解锁帐户,它将需要你在创建此帐户时最初使用的密码短语(密码)。输入该密码以解锁帐户:
>personal.unlockAccount(personal.listAccounts[0])
Unlock account 0xcf61d213faa9acadbf0d110e1397caf20445c58f
Passphrase:
True
(6) 现在打开之前的 Geth 控制台,并部署合约。
但是,在部署合约之前,请确保在 Geth 节点上正在进行挖矿。下面的命令可用于在 Geth 控制台上开始挖矿。
>Miner.start(1)
(7) 将此 Web3 部署脚本粘贴到 Geth 控制台中,如下图所示:
上图显示了将 Web3 部署脚本粘贴到 Geth 控制台进行部署时的输出。还可以通过 Geth 日志进行验证,你将看到类似于以下内容的消息:
INFO [12-16|21:55:49] Submitted contract creatinon
fullhash=0x9f7c81a5942b01f2e2446cad6f0acbaa00514326fcf0abf7b7a076d1
contract=0xBD663C5136155cb6d7ED55446888271DCd5092Bc
(8)成功部署合约后,可以查询与此合约相关的各种属性。如下图所示,这包括合约地址和 ABI 定义等。
1.2 POST 请求
可以通过 HTTP 上的 JSONRPC 与 Geth 进行交互。为此,可以使用 curl 工具。
1.3 HTML 和 JavaScript 前端
网页可以提供更友好与合约进行交互的方式,因此可以考虑使用 HTML/JS/CSS 的网页中的 Web3.js 库与合约进行交互。
可以使用任何 HTTP Web 甩务器来提供 HTML 内容,而 Web3.js 则可以通过本地 RPC 连接到正在运行的以太坊客户端 (Geth), 并为区块链上的合约提供接口。如下图所示:
2. 安装和使用 Web3.js
只需发出以下命令,即可通过 npm 安装 Web3:
[admin@daolian ~]$npm install web3
现在,可以使用任何浏览器来通过 TCP 端口 7777 查看服务的网页,如下图所示.
应该注意的是,此处显示的输出在浏览器的控制台窗口中.
3. 开发框架
以太坊现在有各种开发框架。从上面讨论的示例中可以看出,通过手动方式部署合约可能会非常耗时,如果能够使用 Truffle 或类似框架(如 Embark),则可以使该过程简单、更快捷。我们选择 Truffle 是因为它拥有更活跃的开发者社区,并且是目前使用最广泛的以太坊开发框架。请注意,现在还没有 “最佳” 框架,因为所有框架都旨在提供简化开发、测试和部署的方法。
4. Truffle 应用示例
前文简介绍过 Truffle, 本节将讨论 Truffle 的示例项目,该项目将演示如何使用 Truffle 来开发完整的去中心化应用程序。
我们将使用 Ganache 作为本地区块链来提供 Web3 接口.因此,你需要确保 Ganache 在后台运行并进行挖矿.在以下示例中,它有 5 个帐户,并在端口 7545 上运行.可以在 Ganache 的 SERVER(服务器) 选项中修改这些选项,如下图所示:
为了验证这一点, 可以在 Ganache 中显示交易的帐户列表,如下图所示:
还要注意的是,如下图所示,以太币已从帐户中被消耗掉.随着交易的运行,可以在 Ganache 中看到 BALANCE (余额) 更新.
这将显示类似于下图所示的输出.
这 打开 Web 浏览器并转到 http://localhost:8080,这将显示下图所示的输出.
这些交易将显示在 Ganache 上,如下图所示
6. 去中心化存储
为了充分利用去中心化机制,除去中心化状态/计算(区块链)之外,还可以对存储和通信层也去中心化。
传统上,Web 内容是通过集中式服务器提供服务,但也可以使用分布式文件系统来进行去中心化。