現成工具:CoinTool.App
參考資料
使用智能合約轉代幣是比較容易理解的,上面的鏈接中基本都有,直接拿來可以用。
但是轉eth就有點蒙了。 上面就最后一個鏈接給了代碼,網上查了好幾個地方都是那個代碼,然后再remix中部署,卻沒用- -
單單弄這個批量轉eth搞了好幾天!!!
說明:上面那個代碼實際是有用的,不過是我開始對概念不夠懂..! 上面代碼實際是通過智能合約來轉幣,也就是說,需要智能合約中有eth,才能調用_to.transfer(msg.value); 否則,都沒幣,怎么轉!
之后又糾結於,如何給智能合約地址轉幣... 如果通過其他方式轉給智能合約eth,然后再調用智能合約的批量方法,這就是兩個步驟了,顯然達不到要求...
又糾結了大半天, 最后在一個群友的提示下, 突然想到了remix編輯器右上角有個value... 代碼轉幣的時候也是有個value(轉代幣的時候都是填0x0;
好了,廢話了好多...
下面發直接能用的代碼
合約工具代碼
-
pragma solidity ^0.4.24; -
contract TransferTool { -
address owner = 0x0; -
function TransferTool () public payable{//添加payable,支持在創建合約的時候,value往合約里面傳eth -
owner = msg.sender; -
} -
//批量轉賬 -
function transferEthsAvg(address[] _tos) payable public returns (bool) {//添加payable,支持在調用方法的時候,value往合約里面傳eth,注意該value最終平分發給所有賬戶 -
require(_tos.length > 0); -
require(msg.sender == owner); -
var vv = this.balance/_tos.length; -
for(uint32 i=0;i<_tos.length;i++){ -
_tos[i].transfer(vv); -
} -
return true; -
} -
function transferEths(address[] _tos,uint256[] values) payable public returns (bool) {//添加payable,支持在調用方法的時候,value往合約里面傳eth,注意該value最終平分發給所有賬戶 -
require(_tos.length > 0); -
require(msg.sender == owner); -
for(uint32 i=0;i<_tos.length;i++){ -
_tos[i].transfer(values[i]); -
} -
return true; -
} -
//直接轉賬 -
function transferEth(address _to) payable public returns (bool){ -
require(_to != address(0)); -
require(msg.sender == owner); -
_to.transfer(msg.value); -
return true; -
} -
function checkBalance() public view returns (uint) { -
return address(this).balance; -
} -
function () payable public {//添加payable,用於直接往合約地址轉eth,如使用metaMask往合約轉賬 -
} -
function destroy() public { -
require(msg.sender == owner); -
selfdestruct(msg.sender); -
} -
function transferTokensAvg(address from,address caddress,address[] _tos,uint v)public returns (bool){ -
require(_tos.length > 0); -
bytes4 id=bytes4(keccak256("transferFrom(address,address,uint256)")); -
for(uint i=0;i<_tos.length;i++){ -
caddress.call(id,from,_tos[i],v); -
} -
return true; -
} -
function transferTokens(address from,address caddress,address[] _tos,uint[] values)public returns (bool){ -
require(_tos.length > 0); -
require(values.length > 0); -
require(values.length == _tos.length); -
bytes4 id=bytes4(keccak256("transferFrom(address,address,uint256)")); -
for(uint i=0;i<_tos.length;i++){ -
caddress.call(id,from,_tos[i],values[i]); -
} -
return true; -
} -
}
測試結果圖
node代碼
批量轉代幣,代碼里面的x,自行修改成自己對應的地址參數
(注意,轉代幣需要先調用approve授權,)
-
let contract = new ConfigInit.getWeb3().eth.Contract(TOOLabi, TOOLaddr); -
let destAddr = 'x'; -
let tos = ["x", "x"]; -
let value = ConfigInit.getWeb3().utils.toWei('26.2'); -
let from = 'x'; -
let pData = contract.methods.transfer(from,destAddr,tos,value).encodeABI(); -
let prikey = 'x'; -
TransferUtils.sendTokenOptions(from, prikey, TOOLaddr, '0x0', TOOLaddr, pData).then(function (hash) { -
console.log('------------- ' + hash); -
}).catch(function (e) { -
console.log('------------- ' + e.message); -
}); -
res.send('===========');
批量轉eth
-
router.get('/mulSendEth',function (req,res,next) { -
let contract = new ConfigInit.getWeb3().eth.Contract(ETHTOOLabi, ETHTOOLaddr); -
let tos = ["x","x","x","x"]; -
let web3 = ConfigInit.getWeb3(); -
let value = web3.utils.toWei('1'); -
let from = 'x'; -
let prikey = 'x'; -
let pData = contract.methods.transferETHS(tos).encodeABI(); -
let strvalue = web3.utils.toHex(value); -
TransferUtils.sendTokenOptions(from, prikey, ETHTOOLaddr, strvalue, ETHTOOLaddr, pData).then(function (hash) { -
console.log('------------- ' + hash); -
}).catch(function (e) { -
console.log('------------- ' + e.message); -
}); -
res.send('==========='); -
}); -
router.get('/mulSendEth2',function (req,res,next) { -
let contract = new ConfigInit.getWeb3().eth.Contract(ETHTOOLabi, ETHTOOLaddr); -
let tos = ["x","x","x","x"]; -
let tovalue = ["400000000000000000","100000000000000000","350000000000000000","150000000000000000"]; -
let web3 = ConfigInit.getWeb3(); -
let value = web3.utils.toWei('1'); -
let from = 'x'; -
let prikey = 'x'; -
let pData = contract.methods.transferETHS(tos,tovalue).encodeABI(); -
let strvalue = web3.utils.toHex(value); -
TransferUtils.sendTokenOptions(from, prikey, ETHTOOLaddr, strvalue, ETHTOOLaddr, pData).then(function (hash) { -
console.log('------------- ' + hash); -
}).catch(function (e) { -
console.log('------------- ' + e.message); -
}); -
res.send('==========='); -
});
-
function sendTranscation(tr, fromAddr, privatekey, to, value, data, nonce, gasLimit, gasPrice) { -
let rawTransaction = { -
from: fromAddr, -
to: to, -
value: value, -
gasLimit: toHex(gasLimit), -
gasPrice: toHex(gasPrice), -
data: data, -
nonce: nonce -
}; -
let transaction = new Etx(rawTransaction); -
if (privatekey.startsWith('0x')) { -
privatekey = privatekey.substring(2); -
} -
transaction.sign(Buffer.from(privatekey, 'hex')); -
let serializedTx = transaction.serialize(); -
console.log('0x' + serializedTx.toString('hex')); -
return new Promise(function (resolve, reject) { -
let nhash = ''; -
console.log('sendsignedTransaction--- '); -
ConfigInit.getWeb3().eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('transactionHash', function (hash) {
順便提一下如何使用測試節點。
https://www.rinkeby.io/#faucet
通過fb,或者twitter發布一條帶地址的推文
流程,
-
首先去創建一個錢包地址
https://vintage.myetherwallet.com/ 注意右上角,選擇rinkeby(etherscan.io)
2.發推文 推薦使用twitter; fb特么的不知道怎么獲取單條信息的鏈接..浪費半天時間, 推文內容需要帶上面創建的地址 如類似 https://twitter.com/xxxx/status/113300000000000
3.將上面地址填入https://www.rinkeby.io/#faucet輸入框, 一會就eth到賬。
4.
可以自己搭節點,切換測試節點, 這點不熟。網上找了個...使用infura提供的節點
https://rinkeby.infura.io
可以查詢到剛才的錢包地址有余額
web = new Web3("https://rinkeby.infura.io");



