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用来调用view
和pure
函数。只在本地节点运行,不会在区块链上创建事务。他们是只读的,并不会改变区块链的状态,也不会消耗任何gas,用户也不会要求对MataMask对事务签名。
send
send 将创建一个事务并改变区块链上的数据,需要用send来调用任何非view或者pure的函数。
注意: send 一个事务将要求用户支付gas,并会要求弹出对话框请求用户使用 Metamask 对事务签名。在我们使用 Metamask 作为我们的 web3 提供者的时候,所有这一切都会在我们调用 send() 的时候自动发生。