使用 web3js 和元掩码的 ERC20 transferFrom() 私钥
ERC20 transferFrom() private key with web3js and metamask
我使用标准的 IERC20 创建了一个 ERC20 智能合约。
我做了一个赌博游戏,如果当前用户输了,he/she 将不得不将一个代币转移给经销商(也就是智能合约的部署者 msg.sender)。
根据上述情况,我认为 transferFrom("CURRENT_USER_PRIVATEKEY", "DEPLOYER_PUBLICKEY", 1) 应该是答案。
但是,对于 web3js 和 metamask,我不确定如何获取“CURRENT_USER_PRIVATEKEY”,因为 Metamask 不允许 web3js 获取私钥。在其他 Whosebug 帖子中,我发现我们可以对这个私钥进行硬编码,但这对于具有多个用户的系统来说并不理想。我应该怎么做才能执行这个 transferFrom() 函数?
这是我的智能合约和交易代码:
async playerLoseMoney(){
// Transfer money from player to the dealer
const AMOUNT = 1;
try{
const contract = await this.getContract(erc20_abi_json);
const computerChoice = await contract.methods.TransferFrom(
"0x8a2a3a1dacF2B4b57734eB3DB71c33d3EBe263B6",
"0xc00432E08770B9be73fB2303203B407d7B2E2cf2",
AMOUNT
).call();
alert("You lose 1 coin!")
}catch(err){
alert(err.stack);
window.location.reload();
}
}
contract ERC20Token is IERC20 {
....
function transferFrom(address owner, address buyer, uint256 numTokens) public returns(bool){
require(numTokens <= balances[owner]);
require(numTokens <= allowed[owner][msg.sender]);
balances[owner] = balances[owner].sub(numTokens);
allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
balances[buyer] = balances[buyer].add(numTokens);
emit Transfer(owner, buyer, numTokens);
return true;
}
}
私钥让您可以控制该帐户。因此,erc20 不使用私钥,而是实施允许和批准。我在这里解释了它们:
基本上您的帐户地址允许提取指定代币数量的合约地址。
因此,您应该传递 public 地址而不是传递私钥
我使用标准的 IERC20 创建了一个 ERC20 智能合约。
我做了一个赌博游戏,如果当前用户输了,he/she 将不得不将一个代币转移给经销商(也就是智能合约的部署者 msg.sender)。
根据上述情况,我认为 transferFrom("CURRENT_USER_PRIVATEKEY", "DEPLOYER_PUBLICKEY", 1) 应该是答案。
但是,对于 web3js 和 metamask,我不确定如何获取“CURRENT_USER_PRIVATEKEY”,因为 Metamask 不允许 web3js 获取私钥。在其他 Whosebug 帖子中,我发现我们可以对这个私钥进行硬编码,但这对于具有多个用户的系统来说并不理想。我应该怎么做才能执行这个 transferFrom() 函数?
这是我的智能合约和交易代码:
async playerLoseMoney(){
// Transfer money from player to the dealer
const AMOUNT = 1;
try{
const contract = await this.getContract(erc20_abi_json);
const computerChoice = await contract.methods.TransferFrom(
"0x8a2a3a1dacF2B4b57734eB3DB71c33d3EBe263B6",
"0xc00432E08770B9be73fB2303203B407d7B2E2cf2",
AMOUNT
).call();
alert("You lose 1 coin!")
}catch(err){
alert(err.stack);
window.location.reload();
}
}
contract ERC20Token is IERC20 {
....
function transferFrom(address owner, address buyer, uint256 numTokens) public returns(bool){
require(numTokens <= balances[owner]);
require(numTokens <= allowed[owner][msg.sender]);
balances[owner] = balances[owner].sub(numTokens);
allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
balances[buyer] = balances[buyer].add(numTokens);
emit Transfer(owner, buyer, numTokens);
return true;
}
}
私钥让您可以控制该帐户。因此,erc20 不使用私钥,而是实施允许和批准。我在这里解释了它们:
基本上您的帐户地址允许提取指定代币数量的合约地址。
因此,您应该传递 public 地址而不是传递私钥