Мне нужно запустить node.js для выполнения смарт-контрактов. Мой вопрос о ключах.
Я видел это из документов -
1. Код для подписи 2. Код для выполнения
Но я не уверен, как они сочетаются. Может ли кто-нибудь прояснить это?
У меня есть развернутый контракт, который имеет эту функцию -
функция addBonus( строка BonusType, uint BonusTarget, uint BonusEndYear, uint бонусКонецМесяца, uint бонусКонецДня, строка bonusToken, uint BonusAmount, строка BonusName, uint ineq ) public { // обработка }
Из документов -
var Tx = требуется ('ethereumjs-tx'); var privateKey = новый буфер ('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex') переменная rawTx = { одноразовый номер: «0x00», газПрайс: '0x09184e72a000', газлимит: '0x2710', до: '0x00000000000000000000000000000000000000000', значение: «0x00», данные: '0x7f74657374320000000000000000000000000000000000000000000000000000000600057' } var tx = новый Tx (rawTx); tx.sign (закрытый ключ); вар сериализованныйTx = tx.serialize(); web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) { если (!ошибка) console.log(хеш); // "0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385" });
И это -
// договор аби вар аби = [{ имя: 'мойКонстантныйМетод', тип: 'функция', постоянная: истина, входы: [{ имя: 'a', тип: 'строка' }], выходы: [{имя: 'd', тип: 'строка' }] }, { имя: 'myStateChangingMethod', тип: 'функция', константа: ложь, входы: [{имя: 'a', тип: 'строка'}, {имя: 'b', тип: 'int'}], выходы: [] }, { имя: 'мое событие', тип: 'событие', входы: [{имя: 'a', тип: 'int', индексировано: true}, {имя: 'b', тип: 'bool', индексировано: false}] }]; // создание объекта контракта var MyContract = web3.eth.contract(abi); // инициировать контракт для адреса var myContractInstance = MyContract.at('0xc4abd0339eb8d57087278718986382264244252f'); // вызов константной функции результат var = myContractInstance.myConstantMethod('myParam'); console.log(результат) // '0x25434534534' // отправляем транзакцию в функцию myContractInstance.myStateChangingMethod('someParam1', 23, {значение: 200, газ: 2000}); // короткий стиль web3.eth.contract(abi).at(адрес).myAwesomeMethod(...); // создаем фильтр var filter = myContractInstance.myEvent({a: 5}, функция (ошибка, результат) { если (! ошибка) console.log(результат); /* { адрес: '0x8718986382264244252fc4abd0339eb8d5708727', темы: "0x12345678901234567890123456789012", "0x000000000000000000000000000000000000000000000000000000000000000005", данные: "0x000000000000000000000000000000000000000000000000000000000000000001", ... } */ });
Я предполагаю, что мы должны как-то объединить эти две высказанные идеи. Я не вижу закрытых ключей во втором примере, а в первом нет примера запуска контракта.
var infuraApiKey =process.env.INFURA_API_KEY;
// var privateKey = process.env.PRIVATE_KEY;
var web3js = new web3(new web3.providers.HttpProvider("https://kovan.infura.io/v3/"+infuraApiKey));
web3js.eth.defaultAccount = myAddress;
var privateKey=new Buffer(process.env.PRIVATE_KEY, 'hex');
// var toAddress = 'ADRESS_TO_SEND_TRANSACTION';
//contract abi is the array that you can get from the ethereum wallet or etherscan
var contractABI =bonusABI;
var contractAddress =bonusAddress;
//creating contract object
var contract = web3js.eth.contract(contractABI).at(contractAddress);
var count;
var nounce;
var errcode="";
web3js.eth.getTransactionCount(myAddress, function(err, result) {
nounce=result;
var nounceHex = web3js.toHex(nounce);
var rawTransaction = {"from":myAddress,
"gasPrice":web3js.toHex(2*1e9),
"gasLimit":web3js.toHex(920000),
"to":contractAddress,
"data":contract.addBonus.getData(bonusType, target, year, month, day, token, bonus, bonusName, ineq),
"nonce":nounceHex}
var transaction = new Tx(rawTransaction);
transaction.sign(privateKey);
var serializedTx = transaction.serialize();
web3js.eth.sendRawTransaction('0x'+serializedTx.toString('hex'), function(err1, hash) {
if (!err1) {
errcode=hash;
}
else
errcode=err1;
});
})
вы можете либо добавить его в свой файл .env, если вы используете только одну учетную запись для перевода средств, либо вы можете хранить его в зашифрованном виде в базе данных https://www.npmjs.com/package/bcrypt .
Существует лучший и простой способ подписать и выполнить функцию смарт-контракта. Здесь ваша функция — addBonus.
Прежде всего, мы создадим экземпляр смарт-контракта:
const createInstance = () => {
const bscProvider = new Web3(
new Web3.providers.HttpProvider(config.get('bscRpcURL')),
);
const web3BSC = new Web3(bscProvider);
const transactionContractInstance = new web3BSC.eth.Contract(
transactionSmartContractABI,
transactionSmartContractAddress,
);
return { web3BSC, transactionContractInstance };
};
Теперь мы создадим новую функцию для подписи и выполнения функции addBonus.
const updateSmartContract = async (//parameters you need) => {
try {
const contractInstance = createInstance();
// need to calculate gas fees for the addBonus
const gasFees =
await contractInstance.transactionContractInstance.methods
.addBonus(
// all the parameters
)
.estimateGas({ from: publicAddress_of_your_desired_wallet });
const tx = {
// this is the address responsible for this transaction
from: chainpalsPlatformAddress,
// target address, this could be a smart contract address
to: transactionSmartContractAddress,
// gas fees for the transaction
gas: gasFees,
// this encodes the ABI of the method and the arguments
data: await contractInstance.transactionContractInstance.methods
.addBonus(
// all the parameters
)
.encodeABI(),
};
// sign the transaction with a private key. It'll return messageHash, v, r, s, rawTransaction, transactionHash
const signPromise =
await contractInstance.web3BSC.eth.accounts.signTransaction(
tx,
config.get('WALLET_PRIVATE_KEY'),
);
// the rawTransaction here is already serialized so you don't need to serialize it again
// Send the signed txn
const sendTxn =
await contractInstance.web3BSC.eth.sendSignedTransaction(
signPromise.rawTransaction,
);
return Promise.resolve(sendTxn);
} catch(error) {
throw error;
}
}
Удачного кодирования :)
осалли
.myStateChangingMethod
, вам обычно нужно включатьfrom
адрес в этот последний объект. web3 предположил, что вы, вероятно, хотели использовать первый адрес в хранилище ключей, и автоматически извлек его закрытый ключ для подписи транзакции.Тревор Ли Окли
осалли
web.eth.accounts
. Все, что делает Metamask, — это связывает файл кошелька с вашей учетной записью Google (IIRC). Если у вас уже есть кошелек с вашим адресом и ключами, вы можете загрузить кошелек, и в нем будут сохранены эти ключи. Вы также можете позвонитьwallet.create
, и он создаст новый кошелек в памяти, который вы затем сможете сохранить. Web3 обрабатывает получение ключей и подпись, вам просто нужно сообщить ему, где находятся ключи — MetaMask уже делал это за вас в прошлом.Тревор Ли Окли
осалли
Тревор Ли Окли