Как указать закрытые ключи при использовании node.js и ethereum для запуска контракта?

Мне нужно запустить 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",
       ...
   }
   */
});

Я предполагаю, что мы должны как-то объединить эти две высказанные идеи. Я не вижу закрытых ключей во втором примере, а в первом нет примера запуска контракта.

Ваш вопрос немного сбивает с толку, я не уверен, что именно вы спрашиваете. Фрагмент, который вы разместили, который включал закрытый ключ, выполнил транзакцию для создания контракта, тогда как второй фрагмент выполнил транзакцию для вызова функции в контракте. Во втором фрагменте также используется web3 со встроенным управлением учетными записями. Когда вы вызываете .myStateChangingMethod, вам обычно нужно включать fromадрес в этот последний объект. web3 предположил, что вы, вероятно, хотели использовать первый адрес в хранилище ключей, и автоматически извлек его закрытый ключ для подписи транзакции.
Я не уверен, как использовать web3 без метамаски. Вы заявляете, что у него есть собственное одобрение, но это, например, при использовании метамаски. Чтобы использовать web3, нам нужно как-то подписать txns или предоставить закрытые ключи. Это то, о чем я спрашиваю.
Ознакомьтесь с документацией web3 для web.eth.accounts. Все, что делает Metamask, — это связывает файл кошелька с вашей учетной записью Google (IIRC). Если у вас уже есть кошелек с вашим адресом и ключами, вы можете загрузить кошелек, и в нем будут сохранены эти ключи. Вы также можете позвонить wallet.create, и он создаст новый кошелек в памяти, который вы затем сможете сохранить. Web3 обрабатывает получение ключей и подпись, вам просто нужно сообщить ему, где находятся ключи — MetaMask уже делал это за вас в прошлом.
Я решил это сейчас. Я опубликую позже. Это намного сложнее, чем проверка документов web3.
Хотел бы я лучше понять вашу проблему и помочь вам больше, но рад слышать, что у вас все получилось!
проблема в авторизации txns. Код выложу позже.

Ответы (3)

   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;
}
    }

Удачного кодирования :)