我有一个智能合约的多个令牌持有者,但它仍在考虑第一个

时间:2018-03-08 06:35:04

标签: blockchain ethereum solidity smartcontracts web3js

考虑以下代码,在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
                };

但是上面的代码没有按预期工作。它确实为我提供了事务哈希,但是没有分发令牌。

1 个答案:

答案 0 :(得分:0)

让我们假设ERC20令牌合同并检查不同的用例。

首先需要注意的是,所有转移都可以通过仅调用合同来完成,而不是通过直接相互通信来完成。现在用例......

令牌持有者A - >令牌持有人B: 在这种情况下,持有人A想要将一些令牌转移到持有人B.如果您使用持有人A的私钥签署交易,那么您只需在transfer处的合约上调用contractAddress函数即可。这就是您通过以下代码发送交易所做的事情(如果myAddressnoOfTokens合同中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以获取有关修饰符的更多信息。