Как отправить функцию транзакции/вызова со стороны сервера?

После того, как из моего смарт-контракта исходит событие, и я слышу его на стороне сервера, я хочу вызвать определенную функцию в смарт-контракте и передать ей некоторую информацию для использования.

Мне интересно, как вы размещаете транзакцию на стороне сервера. В этом вопросе все кажется простым: Подписание транзакции на стороне сервера

но как серверная сторона узнает, какую учетную запись использовать/закрытый ключ. На стороне браузера всплывает метамаска, и пользователь физически подписывает ее. Как серверная сторона это делает? Его некому физически подписать и негде всплыть?

Спасибо за любую помощь!

Ответы (3)

Чтобы подписать транзакцию для определенной учетной записи, вам просто нужен доступ к закрытому ключу этой учетной записи.

Такие плагины, как MetaMask, просто управляют доступом к вашим закрытым ключам и позволяют пользователю решать, когда и как использовать свой закрытый ключ для подписи транзакций или сообщений.

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

Взгляните на такие функции, web3.eth.accountsкак:

Вероятно, вам имеет смысл создать конкретную учетную запись Ethereum для вашего сервиса и предоставить этому сервису специальный доступ к вашему контракту, если вы ожидаете, что между этими двумя приложениями будет высокое доверие. Это очень похоже на привилегированное обслуживание вызовов в современной разработке приложений.

Ах хорошо. Поэтому я бы поместил закрытый ключ в переменную и использовал его, чтобы «разблокировать» определенную учетную запись ethereum, которой я владею. Круто спасибо за разъяснение. Один вопрос: как включить специальный доступ к моему контракту для определенного аккаунта. Вы имеете в виду что-то вроде require('thatAccountAddress' == msg.sender), чтобы только эта учетная запись могла вызывать функцию? Или это их другой шаблон, который можно использовать? Спасибо!
Вы хотели бы сделать некоторые RBAC в своем контракте, подобно Open-Zeppelin Ownable.sol , в основном, когда вы определяете определенный адрес, чтобы иметь доступ к функциям, к которым другие учетные записи не имеют доступа. Это может не потребоваться в вашем сценарии, но обычно в системах, где у вас есть серверная часть и смарт-контракт, которые взаимодействуют между собой, вы хотели бы относиться к этому по-другому. Я также рекомендую вам создать новую учетную запись для вашего бэкэнда, а не использовать свою личную учетную запись.

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

вар экспресс = требуется ('экспресс'); вар приложение = экспресс(); const Web3 = требуется('web3'); const web3 = новый Web3(новый Web3.providers.HttpProvider(" http://localhost:7545 "));

web3.eth.defaultAccount = web3.eth.accounts[1];

var StudentContract = web3.eth.contract([ВАШ_ABI]);

var Student = StudentContract.at('YOUR_CONTRACT_ADD');

app.post('/upload', function(req, res) {

    Student.createStudents(studentName,studentAccYear, hashCode, {gas: '195253'});

    var studentEvent = Student.studentInfo();
    studentEvent.watch(function(error, result){
    if (!error)
        {
            console.log(result);
            } else {
            console.log(error);
        } 
        return;
   });

});

app.listen('3000', function(){ console.log('работает на 3000...'); });

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

На стороне клиента кошельки, такие как Metamask, хранят данные вашей учетной записи (включая закрытый ключ), поэтому для транзакций смарт-контракта вас пугает всплывающее окно для подписания транзакции (метамаска с запросом на использование закрытого ключа).

На стороне сервера это несколько похоже, единственное, что вам нужно хранить, — это закрытый ключ учетной записи, с которой вам нужно совершить транзакцию или выполнить смарт-контракт. И после выполнения вашего API вы можете увидеть, как ваши средства автоматически декрементируются из вашего кошелька Metamask вместо платы за газ, если таковая имеется.

Используйте библиотеку ethers.js для выполнения смарт-контрактов.

Пример использования на стороне сервера: -

  const provider = new ethers.providers.JsonRpcProvider(
    'http://localhost:8545'
  );
  const signer = new ethers.Wallet('privateKeyString', provider);
  const contract = new ethers.Contract('contractAddress', abi, signer);
  await contract.someContractFunction();