После того, как из моего смарт-контракта исходит событие, и я слышу его на стороне сервера, я хочу вызвать определенную функцию в смарт-контракте и передать ей некоторую информацию для использования.
Мне интересно, как вы размещаете транзакцию на стороне сервера. В этом вопросе все кажется простым: Подписание транзакции на стороне сервера
но как серверная сторона узнает, какую учетную запись использовать/закрытый ключ. На стороне браузера всплывает метамаска, и пользователь физически подписывает ее. Как серверная сторона это делает? Его некому физически подписать и негде всплыть?
Спасибо за любую помощь!
Чтобы подписать транзакцию для определенной учетной записи, вам просто нужен доступ к закрытому ключу этой учетной записи.
Такие плагины, как MetaMask, просто управляют доступом к вашим закрытым ключам и позволяют пользователю решать, когда и как использовать свой закрытый ключ для подписи транзакций или сообщений.
Для приложения на стороне сервера вам потребуется хранить закрытый ключ, который может использовать служба, и через свой код контролировать, когда и где эта служба подписывает транзакции.
Взгляните на такие функции, web3.eth.accounts
как:
Вероятно, вам имеет смысл создать конкретную учетную запись Ethereum для вашего сервиса и предоставить этому сервису специальный доступ к вашему контракту, если вы ожидаете, что между этими двумя приложениями будет высокое доверие. Это очень похоже на привилегированное обслуживание вызовов в современной разработке приложений.
Я извлек нижеприведенный код из моего скрипта 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();
савард
Шон Табризи