web3js learning

使用console.log(web3.version.api);来查看了web3的版本是0.20.1

参考文档在:
https://github.com/ethereum/wiki/wiki/JavaScript-API
在学习的过程中你会看见很多实例是不一样的,就单单是合约的部署的地方的运行语句就十分地不同,这就是web3 0.2版本跟1.0版本的不同
之后打算使用1.0版本的了

1.首先,需要去声明一个web3实例,,然后去设置provider

if (typeof web3 !== 'undefined') {
  web3 = new Web3(web3.currentProvider);
//当你之前如果使用过mist钱包等时,你的provider可能已经设置好了,web3.currentProvider就是你目前的provider
} else {
  // set the provider you want from Web3.providers
  web3 = new Web3(new Web3.providers.HttpProvider(“http://localhost:8545”));
}
//Note: HttpProvider takes 4 arguments (host, timeout, user, password)

或者:
if(!web3.currentProvider)//返回provider set or null
    web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));

2.在节点中的函数都是默认可以使用回调函数的,举例:
web3.eth.getBlock(48, function(error, result){
    if(!error)
        console.log(JSON.stringify(result));
    else
        console.error(error);
})

3.Batch requests(批处理请求):当你想要请求按一定的顺序一次性调用时
var batch = web3.createBatch();
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2));
batch.execute();


4.web3中的的数字是基于BigNumber Library 的
调用方法:
var BigNumber = require('bignumber.js');
var balance = new BigNumber(‘131242344353464564564574574567456’);

//这样输出为:
BigNumber { s: 1, e: 32, c: [ 13124, 23443534645645, 64574574567456 ] }


console.log(balance.toString(10));//10进制
//这样输出为:131242344353464564564574574567456

balance.plus(21).toString(10); // toString(10) converts it to a number string
// “131242344353464564564574574567477"

a = new BigNumber(1011, 2)          // “11" 二进制
b = new BigNumber('zz.9', 36)       // “1295.25" 36进制



之后从web3的API参考手册开始看起:
1.web3.version.api
使用console.log(web3.version.api);
//来查看了web3的版本是0.20.1


2.web3.version.node
(1)console.log(web3.version.node);
(2)
web3.version.getNode(function(error,result){
    if(!error){
        console.log(result);
    }else{
        console.log(error);
    }
});
//结果都是:Geth/v1.8.3-stable/darwin-amd64/go1.10.1


3.web3.version.network
(1)console.log(web3.version.network);
(2)web3.version.getNetwork(function(error,result){
    if(!error){
        console.log(result);
    }else{
        console.log(error);
    }
});
//得到的结果是geth是设置的networkID 314590 (--networkid 314590)

4.web3.version.ethereum查看以太坊协议的版本
(1)console.log(web3.version.ethereum);
(2)web3.version.getEthereum(function(error,result){
    if(!error){
        console.log(result);
    }else{
        console.log(error);
    }
});
//结果是0x3f(63)

5.web3.version.whisper
whisper实际上就是以太坊p2p网络上的一个应用,所以如果你以后要设计一个聊天室的话,就要使用这个协议了,要感受whisper可以通过启动wnode来感受
可以构建一个完整的p2p聊天室,并且消息加密,无法被追踪;并且不需要服务器,永不停机。基于以太坊的whisper,它本来是为以太坊上的DAPPS通信构建的,有点复杂,以后再学
http://www.cnblogs.com/baizx/p/7505096.html
https://www.cnblogs.com/baizx/p/7898692.html

(1)console.log(web3.version.whisper);
(2)web3.version.getWhisper(function(error,result){
    if(!error){
        console.log(result);
    }else{
        console.log(error);
    }
});

//结果是:Error: The method shh_version does not exist/is not available

6.console.log(web3.isConnected());//true
是否链接了节点

7.web3.setProvider(provider)
var web3 = new Web3();
web3.setProvider(new Web3.providers.HttpProvider(“http://localhost:8201"));//使用local3私有链

8.web3.sha3(string [, options])
var hash = web3.sha3("Some string to be hashed");
console.log(hash); // "0xed973b234cf2238052c9ac87072c71bcf33abc1bbd721018e0cca448ef79b379"
//使用使用keccak-256哈希算法计算字符串的hash值

var hashOfHash = web3.sha3(hash, {encoding: 'hex'});
console.log(hashOfHash); // “0x85dd39c91a64167ba20732b228251e67caed1462d4bcf036af88dc6856d0fdcc"
//当string处的值hash是十六进制时(if the string to hash is encoded in hex),就设置{encoding: ‘hex'}

9.web3.toHex(mixed);
var str = web3.toHex({test: 'test'});
console.log(str); // ‘0x7b2274657374223a2274657374227d'

10.web3.toAscii(hexString);
Converts a HEX string into a ASCII string.

var str = web3.toAscii("0x657468657265756d000000000000000000000000000000000000000000000000");
console.log(str); // “ethereum"

11.web3.fromAscii(string [, padding]);
Converts any ASCII string to a HEX string.
var str = web3.fromAscii('ethereum');
console.log(str); // "0x657468657265756d"

var str2 = web3.fromAscii('ethereum', 32);//32bytes
console.log(str2); // “0x657468657265756d000000000000000000000000000000000000000000000000"
//16进制的1位就是1bytes

12.web3.toDecimal(hexString)//把16进制的字符串转为10进制
13.web3.fromDecimal(number|String);//反过来

14.web3.fromWei(number|String|BigNumber, unit(String))
var value = web3.fromWei('21000000000000', 'finney');
console.log(value); // “0.021"
21000000000000wei->0.021finney

15.web3.toWei(number, unit)
var value = web3.toWei('1', 'ether');
console.log(value); // “1000000000000000000"
//1ether->1000000000000000000wei

16.web3.toBigNumber(numberOrHexString);
17.web3.isAddress(HexString);

18.web3.eth.defaultBlock//默认是最晚生成的那一个latest,或
web3.eth.defaultBlock(blockNumber)
web3.eth.defaultBlock(“earliest")//the genesis block
web3.eth.defaultBlock(“pending”)the currently mined block (including pending transactions)

19.
(1)web3.eth.syncing查询同步的信息
(2)web3.eth.getSyncing(callback(error, result){ ... })
是否正在同步区块,是就返回同步的对象信息:
{
startingBlock:Number - 同步开始区块号
currentBlock: Number - 节点当前正在同步的区块号
highestBlock: Number - 预估要同步到的区块
}
否则返回false

20.web3.eth.isSyncing 检查是否与网络同步
同步有三种状态,true(刚开始)、正在进行时和已经结束false
web3.eth.isSyncing(function(error, sync){
    if(!error) {
        // stop all app activity
        if(sync === true) {
           // we use `true`, so it stops all filters, but not the web3.eth.syncing polling
           web3.reset(true);
        
        // show sync info
        } else if(sync) {
           console.log(sync.currentBlock);
        
        // re-gain app operation
        } else {
            // run your app init function...
        }
    }
});

21.web3.reset
用来重置web3的状态。重置除了manager以外的其它所有东西。卸载filter,停止状态轮询。
参数:
Boolean - 如果设置为true,将会卸载所有的filter,但会保留web3.eth.isSyncing()的状态轮询。

22.web3.eth.hashrate查询每秒节点挖矿的哈希难度

23.web3.eth.gasPrice
返回当前的gas价格。这个值由最近几个块的gas价格的中值决定。
返回的是BigNumber,用toString(10)转成10进制

24.web3.eth.blockNumber目前区块数量

25.web3.eth.getStorageAt????

26.web3.eth.getBlockTransactionCount(hashStringOrBlockNumber |Number [, callback])得到某区块中的交易数量
输入区块的number、hash值或string("earliest", "latest" or “pending”)

27.web3.eth.getTransactionReceipt(transactionHash)
pending的transaction是调用不出来值的,可以查看出更多的信息,可以看出交易是否成功
"status": “0x1"为成功;"status": “0x0"为不成功
若某个transactionHash是生成某个智能合约的,那么用这个函数就可以在contractAddress值处查看到合约的地址

28.web3.eth.sendTransaction(transactionObject [, callback])
transactionObject就是各种值{from:..,to:..,}
    •    from: String - 指定的发送者的地址。如果不指定,使用web3.eth.defaultAccount。
    •    to: String - (可选)交易消息的目标地址,如果是合约创建,则不填.
    •    value: Number|String|BigNumber - (可选)交易携带的货币量,以wei为单位。如果合约创建交易,则为初始的基金。
    •    gas: Number|String|BigNumber - (可选)默认是自动,交易可使用的gas,未使用的gas会退回。
    •    gasPrice: Number|String|BigNumber - (可选)默认是自动确定,交易的gas价格,默认是网络gas价格的平均值 。
    •    data: String - (可选)或者包含相关数据的字节字符串,如果是合约创建,则是初始化要用到的代码。
    •    nonce: Number - (可选)整数,使用此值,可以允许你覆盖你自己的相同nonce的,正在pending中的交易11。


29.web3.eth.sendRawTransaction(signedTransactionData [, callback])发送一个已经签名的交易
signedTransactionData:16进制的签名的交易数据
这就是一个签名的步骤:
var Tx = require('ethereumjs-tx');
var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex')

var rawTx = {
  nonce: '0x00',
  gasPrice: '0x09184e72a000',
  gasLimit: '0x2710',
  to: '0x0000000000000000000000000000000000000000',
  value: '0x00',
  data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057'
}

var tx = new Tx(rawTx);
tx.sign(privateKey);

var serializedTx = tx.serialize();//序列化???

//console.log(serializedTx.toString('hex'));
//f889808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000571ca08a8bbf888cfa37bbf0bb965423625641fc956967b81d12e23709cead01446075a01ce999b56a8a88504be365442ea61239198e23d1fce7d00fcfc5cd3b44b7215f

web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
  if (!err)
    console.log(hash); // "0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385"
});


30.web3.eth.sign(address, dataToSign, [, callback])
使用指定账户address对要发送的数据dataToSign进行签名,所以该账户是要解锁的,dataToSign可以使用进行哈希web3.sha3(“xyz")后的值

然后会返回使用ECDSA(椭圆曲线数字签名算法)签名后得到的字符串,表示为:
r = signature[0:64]
s = signature[64:128]
v = signature[128:130]
就是在eth.getTransaction看到的那几个值


31.web3.eth.filter
输入的值即为输入的过滤条件,对所有的日志信息进行过滤来获得自己想要知道的信息
(1)// filterString can be 'latest' or 'pending'
var filter = web3.eth.filter(filterString);

(2)var filter = web3.eth.filter(options);
    •    fromBlock: Number|string - 起始区块号(如果使用字符串latest,意思是最新的,正在打包的区块),默认值是latest。
    •    toBlock: Number|string - 终止区块号(如果使用字符串latest,意思是最新的,正在打包的区块),默认值是latest。
    •    address: String - 单个或多个地址。获取指定帐户的日志。
    •    topics: String[] - 在日志对象中必须出现的字符串数组。顺序非常重要,如果你想忽略主题,使用null。如,[null,'0x00...'],你还可以为每个主题传递一个单独的可选项数组,如[null,['option1','option1']]。

然后上面的过滤怎么获得信息:
(1)filter.get(callback): 返回满足过滤条件的日志。
(2)filter.watch(callback): 监听满足条件的状态变化,满足条件时调用回调7。
watch监听回调返回值:
    《1》String - 当使用latest参数时。返回最新的一个区块哈希值。
  《2》String - 当使用pending参数时。返回最新的pending中的交易哈希值。
  《3》Object - 当使用手工过滤选项options时,将返回下述的日志对象。
    ◦    logIndex: Number - 日志在区块中的序号。如果是pending的日志,则为null。
    ◦    transactionIndex: Number - 产生日志的交易在区块中的序号。如果是pending的日志,则为null。
    ◦    transactionHash: String,32字节 - 产生日志的交易哈希值。
    ◦    blockHash: String,32字节 - 日志所在块的哈希。如果是pending的日志,则为null。
    ◦    blockNumber: Number - 日志所在块的块号。如果是pending的日志,则为null。
    ◦    address: String,32字节 - 日志产生的合约地址。
    ◦    data: string - 包含日志一个或多个32字节的非索引的参数。
    ◦    topics: String[] - 一到四个32字节的索引的日志参数数组。(在Solidity中,第一个主题是整个事件的签名(如,Deposit(address,bytes32,uint256)),但如果使用匿名的方式定义事件的情况除外)


    filter.stopWatching(): 停止监听,清除节点中的过滤。你应该总是在监听完成后,执行这个操作。

与其有相同的功能的就是合约中的事件event了
当一个合同中有设置event时,如果想要查看event。举例:
得到的是符合条件a == 5的事件myEvent的值
// create filter
var event = myContractInstance.myEvent({a: 5}, function (error, result) {
  if (!error)
    console.log(result);
    /*
    {
        address: '0x8718986382264244252fc4abd0339eb8d5708727',
        topics: "0x12345678901234567890123456789012", "0x0000000000000000000000000000000000000000000000000000000000000005",
        data: "0x0000000000000000000000000000000000000000000000000000000000000001",
        ...
    }
    */
});
或者不回调,使用监听watch或get:
var event = myContractInstance.myEvent({a: 5});
event.watch(function(error, result){
  if (!error)
    console.log(result);
});
event.stopWatching();

条件还可以写成:
var myEvent = myContractInstance.MyEvent({some: 'args'}, {fromBlock: 0, toBlock: 'latest'});


还有监听所有事件的:
var events = myContractInstance.allEvents(条件,回调);



32.如何用语句去配置合约,以前都是说将sol代码导入到remix-ide中去,然后再在它上面进行编译compile-部署deploy,但是现在要学会怎么使用代码去将这些步骤完成了



// Deploy the contract asynchronous(异步) from Solidity file:

const fs = require("fs");
const solc = require('solc')

let source = fs.readFileSync('nameContract.sol', ‘utf8’);

// Setting 1 as second paramater activates the optimiser(最优)
let compiledContract = solc.compile(source, 1);//编译

let abi = compiledContract.contracts[‘nameContract’].interface;

//bytecode就是之前在remix-compile-details-web3deploy中的那串很长的数字
let bytecode = compiledContract.contracts[‘nameContract'].bytecode;

//原来这个是这么算的
let gasEstimate = web3.eth.estimateGas({data: bytecode});
let MyContract = web3.eth.contract(JSON.parse(abi));

//若构造函数没有变量,那么这里的param1, param2是可以去掉的
var myContractReturned = MyContract.new(param1, param2, {
   from:mySenderAddress,//一般就是eth.accounts[0]
   data:bytecode,
   gas:gasEstimate}, function(err, myContract){//这个回调回执行两次
    if(!err) {
       // NOTE: The callback will fire twice!
       // Once the contract has the transactionHash property set and once its deployed on an address.      
//一次是合约的交易哈希属性完成
//另一次是在某个地址上完成部署

       // e.g. check tx hash on the first call (transaction send)
       if(!myContract.address) {//第一次
           console.log(myContract.transactionHash) // The hash of the transaction, which deploys the contract
       
       // check address on the second call (contract deployed)
       } else {//第二次
           console.log(myContract.address) // the contract address
       }

       // Note that the returned "myContractReturned" === "myContract",
       // so the returned "myContractReturned" object will also get the address set.
    }
  });

 


//这个是一个比较特别的input,可以一下子编译两个sol文件,而且还进行调用

var solc = require('solc')
var input = {
    'lib.sol': 'library L { function f() returns (uint) { return 7; } }',
    'cont.sol': 'import "lib.sol"; contract x { function g() { L.f(); } }'
}
var output = solc.compile({ sources: input }, 1)
for (var contractName in output.contracts)
    console.log(contractName + ': ' + output.contracts[contractName].bytecode)

33.返回可用的编译器
var number = web3.eth.getCompilers();
console.log(number); // ["lll", "solidity", “serpent"]三种编译器

34.web3.eth.compile.solidity(sol代码)
编译sol文件

web3数据库部分
35.web3.db.putString(db, key, value)想存储string到本地数据库上的时候使用
Parameters
    1    String - The database to store to.
    2    String - The name of the store.就是相当于索引值的感觉,通过key来找到value
    3    String - The string value to store.
Returns
Boolean - true if successfull, otherwise false.

36.web3.db.getString(db, key)取出

37.web3.db.putHex(db, key, value)想存储16进制时
38.web3.db.getHex(db, key)取出

shh部分——whisper
(这部分我还是不是很明白,之后用得到再看吧)

iban部分,也不知道这个是什么


posted @ 2018-08-27 16:13  慢行厚积  阅读(1299)  评论(0编辑  收藏  举报