Solidity
代幣限制幫助我理解區塊鏈邏輯
在 Solidity 合約中執行
transfer
或transferFrom
ERC-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
(可能是合約)發送代幣。