Comments (3)
Hi Boris, thanks for reporting this. You are correct, this feature hasn't been implemented yet.
The idea was to include this parameter in the .config
at the inception of this feature so when implemented existing clients won't break, as it's one of the few parameters required to instantiate the CoinParameters
class.
The problem is that each request that needs an unlocked wallet takes a different amount of time to be fulfilled, which is totally unpredictable, for example a SendToAddress()
request will take a few milliseconds in a wallet that contains a single unspent output but can take many seconds in a wallet that contains several unspent outputs of small value that have to be combined in an optimal way by the coin selection algorithm to form the requested (by SendToAddress()
) amount.
Setting the WalletPassphrase()
timeout too high will allow for all requests that make use of the RpcUnlockWalletImplicitlyWhenRequired
to be fulfilled but can cause security issues as the wallet will be left unlocked for a longer period of time than needed. Setting it too low can result in failing requests.
And while every app that makes use of this library can adjust the WalletPassphrase
timeouts depending on its type, environment, implementation etc, it's very difficult for this library to come up with a timeout value that will fit all cases, so I suggest we remove the RpcUnlockWalletImplicitlyWhenRequired
parameter from the code. Feel free to perform this change and submit a pull request, in other case I will remove it in the next release.
from bitcoinlib.
Hi George!
What do you think of using RPC timeout as a value for unlock time? And manual locking after method is finished.
Also, do you know internals of bitcoind? Maybe it's engineered that if unlock timeout expires after you invoked SendToAddress() it would still succeed even if method has not returned?
from bitcoinlib.
We could give it a go, although it could be challenging.
A sample implementation could be:
private enum Wallet
{
Lock,
Unlock
}
private void ImplicitlyLockUnlockWalletIfEnabled(Wallet command)
{
if (Parameters.RpcUnlockWalletImplicitlyWhenRequired)
{
switch (command)
{
case Wallet.Lock:
WalletLock();
break;
case Wallet.Unlock:
WalletPassphrase(Parameters.WalletPassword, Parameters.RpcRequestTimeoutInSeconds);
break;
default:
throw new Exception("Unkown WalletSecurity command!");
}
}
}
And then for every command that required an unlocked wallet we could replace the existing implementation in RpcService.cs with something like that:
public String DumpPrivKey(String bitcoinAddress)
{
ImplicitlyLockUnlockWalletIfEnabled(Wallet.Unlock);
String response = _rpcConnector.MakeRequest<String>(RpcMethods.dumpprivkey, bitcoinAddress);
ImplicitlyLockUnlockWalletIfEnabled(Wallet.Lock);
return response;
}
but this would require lots of repetition inside the code, so we should keep on looking for a more elegant approach. Thoughts?
from bitcoinlib.
Related Issues (20)
- Add createwallet HOT 1
- It produces errors with bitcoin core 0.17.1 HOT 4
- Add documentation comments to methods showing which units are returned HOT 1
- GetBlockResponse does not contain weight
- bitcoinlib support .net core? HOT 1
- NetworkHashPS exceeds Int64.Max resulting in overflow HOT 1
- GetRawMemPool(true) throws exception HOT 4
- Is this repo still maintained? HOT 6
- GetBlockTemplate no longer works HOT 4
- Add support for secure (.cookie) auth
- IsWalletEncrypted returns false positive
- Getting - Dummy value must be set to "" - after some of the method calls HOT 6
- Various 'Wallet' RPC Calls Require URL with '/wallet/<wallet-name>' appended HOT 1
- DecodeRawTransaction does not populate addresses
- GetAccount method returns empty string HOT 2
- ListSinceBlock passing wrong parameter by default HOT 4
- How to create transactions that carry messages in OP_RETURN HOT 2
- Getblocktemplate does not provide txid, only hash HOT 3
- No support for new label system HOT 4
- Exception while DumpWallet method HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from bitcoinlib.