Geth控制台的进阶使用 March 5, 2018 [TOC] #### 两个参数 ``` // js加载路径,默认当前目录 --jspath loadScript // 要执行的js命令 --exec value ``` 启动Geth时加上`--jspath script --exec "loadScript('help.js')"` #### 查看所有钱包账户余额 上面两个参数加载help.js到控制台,我们可以在help.js中写一些辅助函数帮助我们提升效率。 ``` function checkAllBalances() { var i =0; eth.accounts.forEach( function(e){ console.log(" eth.accounts["+i+"]: " + e + " \tbalance: " + web3.fromWei(eth.getBalance(e), "ether") + " ether"); i++; }) }; ``` 注意: eth.accounts为当前控制台里新建的所有钱包,不是值整个区块链上的钱包地址。 #### 仅在有交易时挖矿 ``` function minerWhenTransaction() { function checkWork() { if (eth.getBlock("pending").transactions.length > 0) { if (eth.mining) return; console.log("== Pending transactions! Mining...=="); miner.start(1); } else { miner.stop(); // This param means nothing console.log("== No transactions! Mining stopped.=="); } } eth.filter("latest", function(err, block) { checkWork(); }); eth.filter("pending", function(err, block) { checkWork(); }); checkWork(); } ``` #### 查看代币余额 ``` ... ``` 当然你还可以实现其他更多辅助功能。
以太坊搭建POW私链及注意事项 March 5, 2018 [TOC] 主要参考:https://github.com/ethereum/go-ethereum/wiki/Private-network ### 初始化创世区块 json文件: ``` { "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "200000000", "gasLimit": "2100000", "alloc": { "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" }, "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" } } } ``` chainId最好和主网测试网区别开,difficulty是挖矿难度,可以改小一点,alloc是创世区块预先分配的ETH,确保你知道密钥,否则之后无法使用该钱包。 初始化命令: ``` geth --datadir=data init genesis.json ``` `-datadir`指定区块存储地址。 ### 启动节点 命令: ``` geth --identity "myname" --rpc --rpccorsdomain "*" --datadir data/ --port "30303" --rpcapi "db,eth,net,web3,personal,admin,miner" --networkid 15 console ``` `networkid`最好和`chainId`一致,否则无法使用`MetaMask`。 `--rpc`表示开启json rpc服务,`--rpcapi`表示允许rpc使用哪些API 更多参数参见:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options 遇到关闭节点后,区块不保存的现象,加上:`--gcmode=archive`即可。 ### 使用控制台 通过`console`命令进入控制台后,可能会用到一下命令: ``` // 创建账号: personal.newAccount('123456') // 查询账户: eth.accounts // 账户赋值给变量: u1 =eth.accounts[0] u2 =eth.accounts[1] // 查询账户余额: eth.getBalance(u1) // 显示当前区块: eth.blockNumber // 开始挖矿(默认第一个账户得到挖矿收益): miner.start() // 手动指定挖矿收益账户 miner.setEtherbase('0x067D19026e1C15a1b641a191D188542A98f2060e'); // 设定gasPrice miner.setGasPrice(0x123456); // 停止挖矿: miner.stop() // 解锁账户(获得账户使用权): personal.unlockAccount(user1, "123456") // user1转账3以太币给user2: eth.sendTransaction({from: u1, to: u2, value: web3.toWei(1,"ether")}) // 查看交易 eth.getTransaction(txhash) // 查看交易凭证 eth.getTransactionReceipt(txhash) // 查看txpool txpool // 查看nodeInfo admin.nodeInfo // 查看已连接节点 admin.peers ``` 更多命令参见:https://github.com/ethereum/go-ethereum/wiki/Management-APIs 注意,u1发送转账后必须经过挖矿u2才可以收到ETH。 ### 连接节点 A节点通过`admin.nodeInfo`查看节点信息。其中包含了: ``` enode: "enode://44826a5d6a55f88a18298bca4773fca5749cdc3a5c9f308aa7d810e9b31123f3e7c5fba0b1d70aac5308426f47df2a128a6747040a3815cc7dd7167d03be320d@[::]:30303" ``` B节点连接A节点有两种方式: 1.B节点datadir目录下新建`static-nodes.json`,内容: ``` ["enode://44826a5d6a55f88a18298bca4773fca5749cdc3a5c9f308aa7d810e9b31123f3e7c5fba0b1d70aac5308426f47df2a128a6747040a3815cc7dd7167d03be320d@ip:30303"] ``` 2.B节点控制台下: ``` admin.addPeer("enode://44826a5d6a55f88a18298bca4773fca5749cdc3a5c9f308aa7d810e9b31123f3e7c5fba0b1d70aac5308426f47df2a128a6747040a3815cc7dd7167d03be320d@ip:30303") ``` 注意:如果向A节点提交了交易,B节点txpool未收到交易,只需要在A节点开启一下矿工,待B收到txpool之后关闭A节点矿工即可。
以太坊Geth的四种安装方法 March 5, 2018 [TOC] 详细可参考:https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum 安装最简单方便的方法为`二进制安装`,其次`PPA安装`。 ### 二进制安装 官方提供了编译好的二进制安装包,直接下载即可使用。Linux下可以将`Geth`所在目录添加到环境变量,或者直接`sudo mv Geth /usr/bin`。 下载地址:https://geth.ethereum.org/downloads/ ### Ubuntu下通过PPA安装 ``` sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum ``` ### 源代码安装 通过golang编译源代码: ``` sudo apt-get install -y build-essential golang cd go-ethereum make geth ``` 编译完成后在目录`build/bin/geth`下可以看到编译好的Geth。 ### 通过docker安装 Geth不像Hyperledger安装这么麻烦,不建议docker安装,如有需要,参考:https://github.com/ethereum/go-ethereum/wiki/Running-in-Docker
投票私链接口示例 March 1, 2018 [TOC] ### 获取区块数 请求地址:`/getBlockNumber` 请求参数:无 请求方式:Get 描述:获取当前区块数目 返回示例: ``` { "data": 3, "status": 1 } ``` ### 获取钱包 请求地址:`/getWallet` 请求参数:无 请求方式:Get 描述:获取一个钱包,返回私钥和钱包地址 返回示例: ``` { "data": { "address": "0x58BE33a0bf45aE93328b3e3A48fA28Aac49467Cf", "key": "0x2d5a08589520c238ca5a738c2b47831cf6a02c1e22d3383d7e6ea097b6a85454" }, "status": 1 } ``` ### 获取区块详情 请求地址:`/getBlock/` 请求参数:数块number或者区块hash 请求方式:Get 描述:获取区块详情,包含改区块上所含交易的hash 返回示例: ``` { "data": { "hash": "0xe1fc53a54d1b820dcf288e180921c6bb6dcbcace1041f716dd1ea9fdb12b7a2a", "number": 1, "parentHash": "0xf89492f41ba3204f3383449944e79268daf2ef1698b15f66d00090a2fdc811ab", "timestamp": 1519867811, "transactions": [ "0xad64be84ff9fff572a4c07852428cd96e9227df252cc718e7cc7cbaf363c4e62" ] }, "status": 1 } ``` ### 发起交易 请求地址:`/transfer` 请求参数: | 参数名 |参数说明 |参数示例 | | ------------ | ------------ | ------------ | | from_key | 发送人私钥 | 0xabcd... | | to_address | 接受方地址 | 0xabcd... | | tyoe |交易类型 | `ABU`或者`VOTE`| | value | 交易数量 | 100000| 请求方式:Post 描述:发起交易,返回交易hash 返回示例: ``` { "data": { "hash": "0x9943b69ea18609b165dd27504cee4dcf01e791471fa17ca59b91ed46c0c25117" }, "status": 1 } ``` ### 查询交易 请求地址:`/getTransation/` 请求参数:交易hash 请求方式:Get 描述:获取交易详情 返回示例: ``` { "data": { "blockHash": "0xc1a68637fe6453acb5b9244e7f65c6159a8929bbf6da29d5cb0464f12e749a73", "blockNumber": 4, "from": "0x4a244BF6834f7569A726DB8ec0D3B24D31ce52c3", "hash": "0x9943b69ea18609b165dd27504cee4dcf01e791471fa17ca59b91ed46c0c25117", "timestamp": 1519914433, "to": "0xc997450005525b123f4274221af5c55d3def466b", "token_type": "VOTES", "value": 10 }, "status": 1 } ``` ### 获取余额 请求地址:`/getBalance/` 请求参数:钱包地址 请求方式:Get 描述:获取钱包余额 返回示例: ``` { "data": { "ABU": 0, "VOTE": 20 }, "status": 1 } ```
Ubuntu下通过ssh别名快速连接远程服务器以及传输文件 March 1, 2018 [TOC] ### 本机公钥写入服务器 生成密钥对之后把公钥写入服务器`cat id_dsa.pub >> ~/.ssh/authorized_keys ` ### 修改本机ssh配置 `/etc/ssh/ssh_config` 添加 ``` Host qcloud HostName 123.x.x.x Port 22 User ubuntu # IdentityFile ~/.ssh/id_rsa.pub IdentitiesOnly yes ``` ### 连接ssh `ssh qcloud` ### 使用scp `scp /path/file qcloud:path/file`