在合約中向其它賬戶轉(zhuǎn)入其他erc20代幣
在需要使用其他erc20代幣轉(zhuǎn)賬合約中定義token接口增炭,并在接口中定義轉(zhuǎn)賬方法,然后根據(jù)以發(fā)布的ert20代幣合約地址拧晕,將token接口轉(zhuǎn)出對(duì)應(yīng)的token進(jìn)行轉(zhuǎn)賬隙姿。
例如:
pragma solidity ^0.4.16;
//token接口
interface token {
function transfer(address receiver, uint amount) external ;
}
contract TransationContract {
token public tokenReward;
address owner;
constructor (address addressOfToken) public {
owner = msg.sender;
tokenReward = token(addressOfToken);
}
function transferToken(address receiver,uint256 amount) public {
require(amount>0);
tokenReward.transfer(receiver,amount);
}
}
如何給合約加入訪問(wèn)權(quán)限**
給比較敏感數(shù)據(jù)操作的方法添加函數(shù)修改器,在函數(shù)修改器中驗(yàn)證該操作者是否有對(duì)應(yīng)的權(quán)限厂捞。
示例代碼:
pragma solidity ^0.4.16;
contract TransationContract {
address owner;
mapping (address => bool) accessAllowed;
event adminEvent(address addr,bool isAdd);
constructor (address addressOfToken) public {
owner = msg.sender;
accessAllowed[owner] = true;
}
function myMethod(address receiver,uint256 amount) onlyAdmin public {
//業(yè)務(wù)邏輯...
emit EventTransfer(receiver,amount);
}
//更換合約擁有者
function changeOwner(address ownerAddr) public isOwner{
owner = ownerAddr;
}
//析構(gòu)函數(shù)
function kill() isOwner public {
selfdestruct(owner);
}
//設(shè)置管理員
function setAdmin(address addr) isOwner public {
require (msg.sender == owner);
accessAllowed[addr] = true;
emit adminEvent(addr,true);
}
//刪除管理員
function delAdmin(address addr) isOwner public {
require (msg.sender == owner);
accessAllowed[addr] = false;
emit adminEvent(addr,false);
}
modifier isOwner() {
if (msg.sender == owner) {
_;
}
}
modifier onlyAdmin(){
require(accessAllowed[msg.sender] == true);
_;
}
}
根據(jù)交易hash獲取轉(zhuǎn)賬的ERC20代幣的數(shù)量
根據(jù)交易hash输玷,使用web3j獲取交易收據(jù),然后從交易收據(jù)日志中獲取轉(zhuǎn)賬erc20數(shù)量蔫敲。
CompletableFuture<EthGetTransactionReceipt> future = web3j
.ethGetTransactionReceipt("0x464471df25a4bd37a2d88c62895cd64b23dc8d93ba700801fc4eea2eaaa3f164")
.sendAsync();
Future<EthGetTransactionReceipt> f = future.whenComplete((receipt, error) -> {
if (error != null) {
System.out.println(error);
System.out.println("交易查詢失敗!" + error);
return;
}
if (receipt.getResult() == null) {
System.out.println("交易查詢失敗!" + error);
return;
}
System.out.println(receipt.toString());
String from = receipt.getResult().getFrom();
String to = receipt.getResult().getTo();
System.out.println("data:" + receipt.getResult().getLogs().get(0).getData());
long tokenAmount = Integer.parseInt(receipt.getResult().getLogs().get(0).getData().substring(2,
receipt.getResult().getLogs().get(0).getData().length()), 16);
System.out.println("轉(zhuǎn)賬金額:" + tokenAmount);
ta_traction.setText("from:" + from + "\n to:" + to + "\n WDNA數(shù)量:" + tokenAmount);
});
web3j調(diào)用合約時(shí)動(dòng)態(tài)設(shè)置gasLimit和gasPrice
在使用智能合約時(shí)饲嗽,你可能需要根據(jù)調(diào)用函數(shù)指定不同的gasPrice和gasLimit炭玫。你可以通過(guò)為智能合約封裝包創(chuàng)建自己的ContractGasProvider來(lái)實(shí)現(xiàn)這一點(diǎn)奈嘿。
每一個(gè)生成的封裝包都包含作為常量的所有智能合約方法名稱(chēng),這有助于通過(guò)switch
來(lái)進(jìn)行編譯時(shí)間匹配吞加。
例如裙犹,使用Greeter合約:
Greeter greeter = new Greeter(...);
greeter.setGasProvider(new DefaultGasProvider() {
@Override
public BigInteger getGasPrice(String contractFunc) {
switch (contractFunc) {
case Greeter.FUNC_GREET: return BigInteger.valueOf(22_000_000_000L);
case Greeter.FUNC_KILL: return BigInteger.valueOf(44_000_000_000L);
default: throw new NotImplementedException();
}
}
@Override
public BigInteger getGasLimit(String contractFunc) {
switch (contractFunc) {
case Greeter.FUNC_GREET: return BigInteger.valueOf(4_300_000);
case Greeter.FUNC_KILL: return BigInteger.valueOf(5_300_000);
default: throw new NotImplementedException();
}
}
});
dapp開(kāi)發(fā)中如何管理私鑰
dapp接入錢(qián)包的可以使用錢(qián)包管理私鑰尽狠,這種方式安全方便。
應(yīng)用中沒(méi)有錢(qián)包功能的又需要網(wǎng)絡(luò)傳輸私鑰的情況叶圃,要對(duì)私鑰進(jìn)行加密傳輸袄膏。
如何查詢已經(jīng)上交易所的代幣和eth、btc等幣之間的匯率
https://www.bcex.top/Api_Market/getPriceList
https://www.allcoin.ca/Api_Market/getPriceList
查詢eth掺冠、btc等幣當(dāng)前交易價(jià)格
// 獲取eth當(dāng)前價(jià)格
// 獲取ETH價(jià)格
String url = "http://www.btbase.org/currency/ethereum";
// 訪問(wèn)鏈接并獲取網(wǎng)絡(luò)內(nèi)容
String result = sendRequet(url);
// 使用正則表達(dá)式匹配
String dataSrc = RegexString(result, "<i class=\"last_price\">¥(.*?)</i>");
String finalSrc = dataSrc.replaceAll(",", "");
// 轉(zhuǎn)換格式沉馆,折算成人民幣
Float finalToFloat = Float.valueOf(finalSrc);
Float retToFloat = Float.valueOf(WdnaToEthRate);
float cny = finalToFloat * retToFloat;
System.out.println("1WDNA 約等于 " + WdnaToEthRate + " ETH" + "," + " 約等于 " + cny + " CNY");
static String RegexString(String targetStr, String patternStr) {
// 定義一個(gè)樣式模板,使用正則表達(dá)式
Pattern pattern = Pattern.compile(patternStr);
// 定義一個(gè)Match來(lái)匹配
Matcher matcher = pattern.matcher(targetStr);
// 如果找到了
if (matcher.find()) {
return matcher.group(1);
}
return "nothing";
}
查詢合約地址或賬戶地址中某種erc20余額**
參考地址:https://etherscan.io/apis#tokens
在使用erc20轉(zhuǎn)賬時(shí)要考慮代幣的小數(shù)位數(shù)**
轉(zhuǎn)賬時(shí)包含了小數(shù)位數(shù)德崭,轉(zhuǎn)賬前要算上小數(shù)位數(shù)斥黑,例如eth轉(zhuǎn)賬是wei,接受到的value要轉(zhuǎn)換成對(duì)應(yīng)的eth
#####solidity中的匿名方法問(wèn)題
function () public payable{
//。眉厨。锌奴。
}
向合約中轉(zhuǎn)入其他ERC20token時(shí),匿名函數(shù)不會(huì)被調(diào)用憾股,在轉(zhuǎn)入ETH時(shí)匿名方法會(huì)被調(diào)用鹿蜀。