web3.js学习(1)

179 阅读6分钟

ubuntu安装nodejs

更新ubuntu软件源

    sudo apt-get update
    sudo apt-get install -y python-software-properties software-properties-common
    sudo add-apt-repository ppa:chris-lea/node.js
    sudo apt-get update

其中,我在使用第二条命令时发生了有“candidate”的错误。

安装nodejs:

    sudo apt-get install nodejs
    sudo apt install nodejs-legacy
    sudo apt install npm

在第二条时发生了unbale to locate package nodejs的问题,经寻找,应该是环境的问题。其中,第三条用的时间特别长。

更新npm的包镜像源:

    sudo npm config set registry https://registry.npm.taobao.org
    sudo npm config list

安装git:

    sudo add-apt-repository ppa:git-core/ppa
    sudo apt-get update
    sudo apt-get install git

查看版本号:

    git --version

geth

geth(Go-Ethereum)室友以太坊基金会积极开发的go语言实现,被认为是以太坊客户端的“官方”实现。通常 ,每个基于以太坊的区块链都有自己的geth实现。

geth安装:

    sudo apt-get install software-properties-common
    sudo add-apt-repository -y ppa:ethereum/ethereum
    sudo apt-get update
    sudo apt-get install ethereum

获取geth指令:

    geth --help

JSON-RPC

以太坊客户端提供了API 和一组远程调用(RPC)命令,这些命令被编码为 JSON。这被称为 JSON-RPC API。

本质上,JSON-RPC API 就是一个接口,允许我们编写的程序使用以太坊客户端作为网关,访问以太坊网络和链上数据。

通常,RPC 接口作为一个 HTTP 服务,端口设定为 8545。出于安全原因,默认情况下,它仅限于接受来自 localhost 的连接。

要访问JSON-RPC API,我们可以使用编程语言编写的专用库,例如JavaScript的 web3.js。 • 或者也可以手动构建HTTP请求并发送/接收JSON编码的请求,如:

    $ curl -X POST -H "Content-Type: application/json" --data 
    '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1
    }' 
    http://localhost:8545

IPC协议

进程间通信IPC(Inter Process Communication)是一组编程接口,让程序员能够协调不同的程序进程,使之能在一个操作系统里同时运行。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。每个IPC方法均有它自己的优点和局限性,因此,对于单个程序而言使用所有的IPC方法是不常见的。

IPC包括共享内存、队列、信号量等几种方式,由于IPC通讯效率之高,所以大量的Unix下软件都用IPC通讯,如oracle。

如果两个进程在同一台机子且在同一个操作平台,可选择IPC或TCI/IP两种通讯方式都可以,但IPC效率高于TCP/IP。采用IPC通讯,进程1直接把通讯包发给进程2,采用TCP/IP通讯,进程1将要先把通讯包发给“LO”即本地环路接口,通过"LO"再把通讯包发给进程2。

如果两个进程在不同的物理机上或在不同的操作平台,则不能用IPC,这时用TCP/IP通讯,进程1把通讯包发给本机的物理网卡1,物理网卡1通过网线把通讯包发给进程2所在的机器的物理网卡2,网卡2再把通讯包发给进程2。

Glossory词汇表

json接口

json接口是描述以太坊智能合约的应用程序二进制接口(ABI)的json对象。使用这个json接口web3.js就能够使用web3.eth.Contract对象创建表示智能合约及其方法和事件的JavaScript对象。

规格

功能:

  • type: "function", "constructor"(可以省略,默为"function";"fallback"也可以,但在 web3.js 中不相关);

  • name: 函数的名称(仅存在于函数类型);

  • constant:true如果函数被指定为不修改区块链状态;

  • payable:true如果函数接受以太,默认为false;

  • stateMutability:具有以下值之一的字符串:(pure指定为不读取区块链状态)、view(constant同上)nonpayable和payable(payable同上);

  • inputs: 一个对象数组,每个对象包含:

  • name: 参数名称;

  • type:参数的规范类型。

  • outputs: 与 相同的对象数组,inputs如果不存在输出,则可以省略。

事件:

  • type: 总是"event"

  • name:事件的名称;

  • inputs: 一个对象数组,每个对象包含:

  • name: 参数名称;

  • type:参数的规范类型。

  • indexed:true如果该字段是日志主题的一部分,false如果它是日志的数据段之一。

  • anonymous:true如果事件被声明为anonymous.

例如:

    contract Test {
        uint a;
        address d = 0x12345678901234567890123456789012;

        function Test(uint testInt)  { a = testInt;}

        event Event(uint indexed b, bytes32 c);

        event Event2(uint indexed b, bytes32 c);

        function foo(uint b, bytes32 c) returns(address) {
            Event(b, c);
            return d;
        }
    }

    // would result in the JSON:
    [{
        "type":"constructor",
        "payable":false,
        "stateMutability":"nonpayable"
        "inputs":[{"name":"testInt","type":"uint256"}],
      },{
        "type":"function",
        "name":"foo",
        "constant":false,
        "payable":false,
        "stateMutability":"nonpayable",
        "inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}],
        "outputs":[{"name":"","type":"address"}]
      },{
        "type":"event",
        "name":"Event",
        "inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}],
        "anonymous":false
      },{
        "type":"event",
        "name":"Event2",
        "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],
        "anonymous":false
    }]

cryptozombies的web3.js章节

web3提供者

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

Infura

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

可以通过这样把 Infura 作为你的 Web3 节点提供者:

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

与合约对话

web3.js需要两个东西来与合约对话:

- 它的地址

- 它的ABI(二进制接口,Application Binary Interface)

ABI是以JSON格式表示合约的方法,告诉Web3.js如何以合同理解的方式和石化函数调用。

一旦有了合约的地址和ABI,就可以这么实例化Web3.js:
// 实例化 myContract     var myContract = new web3js.eth.Contract(myABI, myContractAddress);

调用和合约函数

web3.js有两个方法可以用来调用智能合约:

  • call

  • send

call

call用来调用viewpure函数。只在本地节点运行,不会在区块链上创建事务。他们是只读的,并不会改变区块链的状态,也不会消耗任何gas,用户也不会要求对MataMask对事务签名。

send

send 将创建一个事务并改变区块链上的数据,需要用send来调用任何非view或者pure的函数。

注意: send 一个事务将要求用户支付gas,并会要求弹出对话框请求用户使用 Metamask 对事务签名。在我们使用 Metamask 作为我们的 web3 提供者的时候,所有这一切都会在我们调用 send() 的时候自动发生。