Solidity

代幣限制幫助我理解區塊鏈邏輯

  • September 1, 2020

在 Solidity 合約中執行transfertransferFromERC-20 代幣功能,即:

// moves token from contract to personal address
       ERC20Token.transfer(msg.sender, tokenamount);
// moves token from personal account to contract 
       ERC20Token.transferFrom(msg.sender, address(this), tokenamount);

我必須首先approve在solidity之外的javascript中執行該函式,如下所示:

 contract = w3.eth.contract(address=contract_address, abi=contract_abi['abi'])
 nonce = w3.eth.getTransactionCount(wallet_address)
 txn_dict = contract.functions.approve(contract_address, amount).buildTransaction({
 'gas': 500000,
 'gasPrice': w3.toWei(gas_p, 'gwei'),
 'nonce': nonce,
})
signed_txn = w3.eth.account.signTransaction(txn_dict, private_key=wallet_private_key)
result = w3.eth.sendRawTransaction(signed_txn.rawTransaction)

我想知道是否可以將“批准”方法放入 Solidity 合約中,但後來想,這會很糟糕,因為惡意合約可能會在同一個區塊中執行approve&函式,從而允許代幣超支。transfer這是正確的思考方式嗎?

$$ I could be wrong in my assumption that you cannot approve an ERC-20 token expenditure within a Solidity contract $$ 這很有趣,因為一方面,我可以想像代幣的配額量會在呼叫轉移函式時被修改,這取決於 Solidity 合約是在一個塊中按順序執行還是同時執行。

approve不能代表使用者從 Solidity 合約中呼叫。您可以使用它來允許另一個合約在合約本身中使用代幣。該approve函式如下所示:

function approve(address _spender, uint256 _value) public returns (bool success)

如您所見,沒有辦法指定要approve用於的地址。它將使用msg.sender,在從合約呼叫它的情況下,它將是合約本身的地址。這意味著使用者必須從他們自己的地址發送交易才能允許_spender(可能是合約)發送代幣。

引用自:https://ethereum.stackexchange.com/questions/87087