Diese Frage hängt mit diesem und diesem zusammen . Es hat auch eine Teilantwort hier und hier .
Im dritten Link wird das Konto mit web3.js für einen bestimmten Zeitraum entsperrt :
web3.personal.unlockAccount("0x..", "<passs>", 1000);
Der Parameter Entsperrzeitraum ist optional.
Wie kann überprüft werden, ob Konten gesperrt sind (vor Durchführung von Transaktionen)?
Hat das Entsperren eines bereits entsperrten Kontos Auswirkungen auf die Funktionalität?
Derzeit gibt es in der web3 JS-API keine Methode , um zu überprüfen, ob ein Konto gesperrt ist oder nicht.
Wenn ein Konto jedoch bereits entsperrt ist, gibt es anhand des Codes kein Problem, die Entsperrung erneut aufzurufen.
// If the account address is already unlocked for a duration, TimedUnlock extends or
// shortens the active unlock timeout. If the address was previously unlocked
// indefinitely the timeout is not altered.
func (am *Manager) TimedUnlock(a Account, passphrase string, timeout time.Duration) error {
Warum betrachten wir nur TimedUnlock()
, das vermutlich nur aufgerufen wird, wenn wir den dritten Parameter übergeben?
Wie Sie angemerkt haben, ist der Parameter für den Entsperrzeitraum optional. Wenn es nicht angegeben ist, rufen wir auf Unlock()
, was ein Wrapper um TimedUnlock()
ist, der aber 0
als Zeitraum übergeben wird. Daher brauchen wir TimedUnlock()
bei der Erklärung nur die Funktion zu berücksichtigen.
Hier ist eine Problemumgehung, um zu überprüfen, ob das Konto entsperrt ist. Es ist nicht sehr schön, aber in den meisten Fällen funktioniert es. Verwenden Sie es nur für Entwicklungszwecke im Testnetz oder im privaten Netz!!! Weil "dies eine tatsächliche Transaktion aussendet, für die Sie Benzin bezahlen müssen", Konten entsperren und Transaktionen in web3.js durchführen
function isAccountLocked(account) {
try {
web3.eth.sendTransaction({
from: account,
to: account,
value: 0
});
return false;
} catch (err) {
return (err.message == "authentication needed: password or unlock");
}
}
function unlockAccountsIfNeeded(accounts, passwords, unlock_duration_sec) {
if (typeof(unlock_duration_sec)==='undefined') unlock_duration_sec = 300;
for (let i = 0; i < accounts.length; i++) {
if (isAccountLocked(accounts[i])) {
console.log("Account " + accounts[i] + " is locked. Unlocking")
web3.personal.unlockAccount(accounts[i], passwords[i], unlock_duration_sec);
}
}
}
Sie können web3.eth.sign verwenden und prüfen, ob es fehlschlägt.
async function isUnlocked (web3, address) {
try {
await web3.eth.sign("", address);
} catch (e) {
return false;
}
return true;
}
Dies ist eine mögliche Methode, die direkt die JSON RPC-Methode aufruft personal_listWallets
:
async function listWallets() {
try {
const result = await sendRPC_personal_listWallets();
console.log(typeof result);
return result;
} catch (e) {
return e;
}
}
function sendRPC_personal_listWallets() {
return new Promise((resolve, reject) => {
web3.currentProvider.send({ method: "personal_listWallets", params: [], jsonrpc: "2.0", id: new Date().getTime() },
function (error, result) { if (error) { reject(error); } else { resolve(result); } });
}
);
}
let wallets;
listWallets().then((r) => { console.log("ID:", r.id); wallets = r.result; console.log("Accounts:", wallets); });
personal
API veraltet ist und dies in der Praxis von keinem Benutzer-Wallet implementiert wird. ethereum.stackexchange.com/questions/82531/…personal
API veraltet ist? Ich habe nachgesehen, alles, was ich finden konnte, ist, dass der HTTP-Anbieter hier veraltet ist - web3js.readthedocs.io/en/v1.2.11/…
Andi Giga
let account = self.web3.eth.accounts.privateKeyToAccount(self.config.walletPrivateKey);
&self.web3.eth.personal.unlockAccount(account.address, account.privateKey, 200)
Sebi
Mikko Ohtamaa