Контракт солидности:
contract MyContract {
bytes32 public product;
uint public amount;
function setOrder(bytes32 _product, uint _reorderAmount,) public returns (bool success);
}
Javascript web3js (без node.js):
<script src="./web3.min.js"></script>
<script>
web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/key"));
web3.eth.defaultAccount = "0x...address of my account...";
var myContract = web3.eth.contract([...abi...]);
var contractInstance = myContract.at('0x...contract address...');
contractInstance.setOrder(web3.toHex('ProductName'),3000);
</script>
Это работает, когда у меня работает ganache-cli, но не в тестовой сети (например, Ropsten). В тестовой сети я могу использовать только геттерные функции, но как мне вызвать сеттерную функцию? Что мне здесь не хватает?
Транзакции должны быть подписаны закрытым ключом отправляющей учетной записи.
Вы используете Infura в качестве провайдера web3 и просите его отправить вам транзакцию. Он не может этого сделать, потому что не знает закрытого ключа вашей учетной записи.
Вам нужно будет либо написать код для подписи транзакции самостоятельно, либо (более типичный подход) использовать поставщика web3, такого как MetaMask, в браузере. MetaMask хранит закрытые ключи пользователя и подписывает транзакции от его имени (после запроса подтверждения).
Согласно документу , вы должны изменить contractInstance.setOrder(web3.toHex('ProductName'),3000);
метод на
Отправить транзакцию: (Ваш случай)
contractInstance.setOrder.sendTransaction(web3.toHex('ProductName'),3000, { from: ethaddress }, function(err, result){ ... })
Если вы хотите просто вызвать функцию, которая не обновляет состояние (и ничего не стоит):
contractInstance.product.call(param1, , function(err, result){ ... })
methods
после того, как я записываю экземпляр в консоль браузера. Также мне не нужно каким-то образом предоставлять ключ, чтобы подписать транзакцию изменения состояния? from: ethaddress
не может быть достаточно или это?Вам необходимо использовать Web3js для подписи транзакции на стороне клиента перед ее отправкой в Infura:
web3.eth.sendSignedTransaction(
web3.eth.accounts.signTransaction(
{
to: contractInstance.address,
data: contractInstance.methods.setOrder.encodeABI(
web3.toHex('ProductName'),3000),
gas: 100000
}));
Подробнее см. документацию
Каки Мастер Времени
siloContract
? а какую версию web3 используете?sunwarr10r
MyContract
. Я использую 0.20.6Каки Мастер Времени
coinbase
), чтобы иметь возможность вызывать транзакции на ropsten.