以太坊的编程接口

三种方式与区块链交互:

  • JavaScript Console:在geth控制台与以太坊交互。
  • JSON-RPC:一种无状态的、轻量级的远程过程调用协议,可以跨语言调用。
  • web3.js:web3.js是以以太坊提供的一个javascript库,它封装了以太坊的JSON-RPC
    API,提供了一系列与区块链交互的javascript对象和函数。
  1. Web3.js API

1:创建web3.js

npm install --save web3.0.20.0;

2:创建wbe3实例

//要使用web3.js与区块链交互,首先需要创建web3对象,然后连接到以太坊节点
var web3 = require("web3");
//创建web3对象
var wbe3 = new Web3();
//连接到以太坊节点
web3.setProvider(new Web3.providers.Httprovider("http://localhost:8545"));

  1. 账户相关API
// 查看当前连接的以太坊节点所有的可用账号:

// 列出所有的可用账户
var accounts = web3.eth.accounts;
console.info(accounts);

// 差看余额
var balance_1 = web3.eth.getBalance(web3.eth.accounts[0])
console.info(balance_1.toString());
// 这里返回的余额是以wei单位来表示的,如果想要以ether为单位表示,可以
var balance_eth = web3.fromWei(balance_1,'ether');
  1. 交易相关API

1:账户之间转账交易

//估算转账大概需要消耗的gas
var estimate_gas = web3.eth.estimateGas({
    from: web3.eth.accounts[0],
    to: web3.eth.accounts[1],
    value: web3.toWei(1, 'ether')
});
console.info(estimate_gas);
//一个交易通常由以下几个部分组成:
1、from:交易发送者的地址,这笔交易最后需要from的私钥签名
2、to:接受这笔交易转账的目的地址
3、value:这笔交易转账的金额,以wei为单位
4、gas:这笔交易中可使用的gas,未使用的gas会被退回。
5、gasPrice:这笔交易中的gas价格,为使用的gas会被退回

//交易对象构建完成后就可以通过web3.eth.sendTransaction向节点发送交易请求了

//开始转账操作
var txId = web3.eth.sendTransaction({
    from: web3.eth.accounts[0],
    to: web3.eth.acounts[1],
    value: web3.toWei(1, 'ether'),
    gas: estimate_gas
});
//返回的交易hash
console.log(txId);

// 交易被发送成功后返回一个交易Hash值,通过这个交易Hash值,进行以下两步操作:

// 查询转账交易详情
var tx = web3.eth.getTransaction(txId);
console.log(tx)
//查询交易收据详情
var tx_receipt = web3.eth.getTeansactionReceipt(txId)
console.log(tx_receipt)
  1. 发送一个已经签名的转账交易
//如果我们自己有一个账户,并且这个账号不存储在我们连接的以太坊节点中,那么我们怎么通过web3提供的API去发送交易呢?我们可以通过web3.eth.sendRawTransaction方法完成交易的签名与发送。

(1) 创建待发送的交易
var address = "0xasd15d1as5d8adas5d415dasd";
var nonce = web3.eth.getTransactionCount(address, 'pending');
var amount = web3.toWei(1, 'ether');

var rawTx = {
    from: address,
    to: '0xasd15d1as5d8adas5d415dasd',
    value: web3.toHex(amount),
    nonce: web3.toHex(nonce),
    gasLimit: web3.toHex('49674')
}

//rawTx中包含
-nonce: 记录from账号送出的交易数量,用来避免replay attack,每次发送都要加1。可以用eth_getTransactionCount查询目前账户的nonce。
-gasLimit:当前交易最大消耗gas数量,多余的会在交易结束后返还。
-to:接受者地址
-value: 要送的ether数量,以wei为单位

(2) 给交易添加签名
//要想给刚刚创建的交易rawTx加上签名,需要使用另外一个库,该库通过npm命令安装:
npm install --save ethereumjs-tx@1.3.3
//安装成功后,开始给rawTx创建签名;

// 引入包
var Tx = require('ethereumjs-tx');

//创建 raw transaction
var tx = new Tx(rawTx);

//from地址的私钥
var privatekey = new Buffer('sadqwdqwdqw8d4814d5as4d8w14d5as4d8as1d51w4d5as1d5as4d5as', 'hex')

//使用私钥给rawTx签名
tx.sign(privateKey)

//签名后的交易
var seializedTx = tx.serialize();

//控制台输出签名后的交易信息
console.log(seralizedTx.toString('hex'));

(3) 发送已签名交易
// 交易发送成功后会返回一个交易的Hash值
webe.eth.sendRawTransaction('ox' + seializedTx.toString('hex'), function(err, hash){
    if(!err){
        console.lof(hash); //返回交易
    } else {
        console.log(err)
    }
})
  1. 调用合约
pragma solidity ^0.4.20;

contract Storage {
    uint256 storedData;
    function set(uint256 data) {
        storedData = data
    }
    function get() constant returns (uint256) {
        return storedData;
    }
}

// 合约部署完成后得到三个重要的东西:
1、合约地址:'0xasdd1sa5d5as4d1d15sad51d'
2、合约的接口地址文件:
[{
    "constant": false,
    "inputs": [{
        "name": "data",
        "type": "uint256"
    }],
    "name": "set",
    "outputs": [],
    "payable": false,
    "type": "function"
},{
    "constant": true,
    "inputs": [],
    "name": [{
        "name": "",
        "type": "uint256"
    }],
    "payable": false,
    "type": "function"
}]
3、合约函数的签名,合约函数的签名获取方式如下:
//将合约的get()方法先经过sha3计算后,取除后0x外的前面的8位
var get_func_sign = web3.sha3('gte()').substr(2,8);
//将合约的set(uint256)方法经过sha3计算后,取除了0x外的前面的8位
var set_func_sign = web3.sha3('set(uint256)').substr(2,8);

- 通过合约地址加被调用合约的函数签名
// 首先创建一个调用get方法的交易
var tx_set = {
    "from": "0xasd5asd151wd5as1d5sa4d55asd5wq4d5qwd",
    "to": "0xas1d5sa1d54w15d1as5d1qw5da5s1d5as1d5as",
    "gasLimit": web3.toHex('5000'),
    "data": "0xasdasd210000000000000000000000000000001"
}
//tx_set中包含:
1、from: 交易发送者的地址
2、to;合约地址
3、gasLimit: 这笔交易中允许消耗的最大gas数量
4、data: 传给合约的参数
// 执行方法
var txId = web3.eth.sendTransaction(tx_set);//向以太坊网络发送一个交易,返回交易hash
// 执行成功后,继续调用get方法看返回的hash
var result = web3.eth.call(tx_get) //执行一个消息调用交易
  1. 区块相关的API
// 查询最新的区块
1)通过最新区块编号查询
//最新区块编号
var blockNumber = web3.eth.blockNumber;
//根据最新区块编号获取区块详情
var last_block = web3.eth.getBlock(blockNumber);
console.log(last_block)

2)根据区块编号或Hash查询区块
//根据区块编号查询区块信息
var block = web3.eth.getBlock(0);
// 根据区块Hash查询区块信息
var block = web3.eth.getBlock("0xas1dsad2as15das5d4wq5d45asd");
console.log(block)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容