考虑以下代码,在ropsten测试网中进行web3js和ethereum智能合约之间的通信。
web3.eth.getTransactionCount(contractAddress).then(function(lastCountOfTransaction){
var rawTransaction = {
"from": contractAddress,
"nonce": "0x" + lastCountOfTransaction.toString(16),
"gasPrice": web3.utils.toHex(1 * 1e9), //1 can be changed to n gwei
"gasLimit": web3.utils.toHex(1000000), // 1000000 can be to set to any n number
"to": userAddress,
"value": "0x0",
"data": ContractObject.methods.transfer(userAddress, noOfTokens).encodeABI(),
"chainId": chainId
};
var tx = new Tx(rawTransaction);
tx.sign(privKey);
var serializedTx = tx.serialize();
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'),function(err,hash){
if (!err){
console.log(hash);
resolve(hash);
}
else{
console.log(err);
resolve(err);
}
});
});
我有多个令牌持有者,例如一个是合约地址,其具有令牌的初始值,一个是具有总供应数量的令牌所有者。我想从合同地址而不是合同所有者帐户中提供令牌。如果我们改变如下
,则从所有者帐户转移令牌有效web3.eth.getTransactionCount(myAddress).then(function(lastCountOfTransaction){
var rawTransaction = {
"from": myAddress,
"nonce": "0x" + lastCountOfTransaction.toString(16),
"gasPrice": web3.utils.toHex(1 * 1e9), //1 can be changed to n gwei
"gasLimit": web3.utils.toHex(1000000), // 1000000 can be to set to any n number
"to": contractAddress,
"value": "0x0",
"data": ContractObject.methods.transfer(userAddress, noOfTokens).encodeABI(),
"chainId": chainId
};
但是上面的代码没有按预期工作。它确实为我提供了事务哈希,但是没有分发令牌。
答案 0 :(得分:0)
让我们假设ERC20令牌合同并检查不同的用例。
首先需要注意的是,所有转移都可以通过仅调用合同来完成,而不是通过直接相互通信来完成。现在用例......
令牌持有者A - >令牌持有人B:
在这种情况下,持有人A想要将一些令牌转移到持有人B.如果您使用持有人A的私钥签署交易,那么您只需在transfer
处的合约上调用contractAddress
函数即可。这就是您通过以下代码发送交易所做的事情(如果myAddress
在noOfTokens
合同中contractAddress
的余额高于 var rawTransaction = {
"from": myAddress,
"nonce": "0x" + lastCountOfTransaction.toString(16),
"gasPrice": web3.utils.toHex(1 * 1e9), //1 can be changed to n gwei
"gasLimit": web3.utils.toHex(1000000), // 1000000 can be to set to any n number
"to": contractAddress,
"value": "0x0",
"data": ContractObject.methods.transfer(userAddress, noOfTokens).encodeABI(),
"chainId": chainId
};
,这将有效
transferFrom
令牌持有者A - >令牌持有人B通过地址C:
在这种情况下,地址C希望代表持有者A进行交易。因此,要调用的标准函数是myAddress
。假设从持有人A到地址C给出了某种批准,并且 var rawTransaction = {
"from": myAddress, // refers to Address C
"nonce": "0x" + lastCountOfTransaction.toString(16),
"gasPrice": web3.utils.toHex(1 * 1e9), //1 can be changed to n gwei
"gasLimit": web3.utils.toHex(1000000), // 1000000 can be to set to any n number
"to": contractAddress,
"value": "0x0",
"data": ContractObject.methods.transferFrom(userAddressA, userAddressB, noOfTokens).encodeABI(),
"chainId": chainId
};
指的是地址C,您可以使用以下交易
onlyOwner
就ERC20而言。有关详细信息,请参阅https://theethereum.wiki/w/index.php/ERC20_Token_Standard。
你在做什么感觉像铸造,而ERC20并没有标准化。
你可以在这里做的是设置合同的所有者,并在合同中使用mint
之类的修饰符作为mint
函数。这样的function mint(address _to, uint256 _amount) onlyOwner canMint returns (bool) {
totalSupply = totalSupply.add(_amount);
balances[_to] = balances[_to].add(_amount);
Mint(_to, _amount);
return true;
}
函数看起来像
mint
这样您就可以从myAddress
调用userAddress
函数(如果该地址是所有者)并传递应该收到令牌的mint
。您还可以选择保持上限并通过引入canMint
函数或向其添加其他修饰符(如sed -i "s/relayhost =.*/relayhost = ${MAIL_RELAY_HOST}/" /etc/postfix/main.cf
)来使标记上限。您可以查看https://solidity.readthedocs.io/en/develop/contracts.html#function-modifiers以获取有关修饰符的更多信息。