In Error using web3.eth.personal.sign , the problem with the number of arguments was resolved. But now that I can try the actual call, I'm getting a "does not exist" error.

console.log("Calling personal.sign");
this.web3.eth.personal.sign(this.bottleDataToSign, this.addressProdFrom, this.passwordProd)


Calling personal.sign
Error: Uncaught (in promise): Error: Returned error: The method personal_sign does not exist/is not available ErrorResponse onreadystatechange wrapFn onInvokeTask runTask invokeTask invokeTask globalZoneAwareCallback

In node_modules/web3-eth-personal/src/index.js, it looks like "sign" actually calls "personal_sign":

new Method({
        name: 'sign',
        call: 'personal_sign',
        params: 3,
        inputFormatter: [formatters.inputSignFormatter, formatters.inputAddressFormatter, null]

Poking around in other node_modules/web3 directories/files, I didn't see any declaration for it:

$ grep -r "personal_sign" web3*
web3-core-helpers/src/formatters.js: * Hex encodes the data passed to eth_sign and personal_sign
web3-eth-personal/src/index.js:            call: 'personal_signTransaction',
web3-eth-personal/src/index.js:            call: 'personal_sign',

So does this imply the code is just missing? Am I calling it correctly? I'm still using npm web3 package: 1.0.0-beta.33, and used it from an import Web3 from "web3"; Anything else to try? Thanks.

  • Has your web3 provider enabled personal RPC?
    – Ayushya
    Commented Mar 26, 2018 at 18:11
  • I don't know. I do have a web3 = new Web3('http://localhost:8545'); // port# from geth's rpcport line for the actual web3 variable, but I thought that was only needed for talking to a geth node, which I didn't think personal.sign had to do. If needed, how would I do that? Thanks.
    – gkd720
    Commented Mar 26, 2018 at 18:37
  • @gkd720 What command line do you use to launch geth?
    – Ismael
    Commented Mar 27, 2018 at 2:45
  • I invoke geth with: $ geth --identity "TestNode1" --rpc --rpcport "8545" --rpccorsdomain "*" --datadir "~/ethereum/TestChain1" --port "30303" --nodiscover --ipcdisable --rpcapi "db,eth,net,web3" --networkid 2429 --keystore ~/Library/Ethereum/keystore console But why does this even matter? I'm just calling a web3 package method, not yet trying to issue a transaction through geth; that was my next step in the flow. Thanks.
    – gkd720
    Commented Mar 27, 2018 at 15:12
  • @Ayusha care to elaborate how??
    – Jim
    Commented Nov 1, 2021 at 21:38

2 Answers 2


After further extensive searching, I now see what @Ayushya and @Ismael were getting at. After adding "personal" to the list of items for option --rcapi, I can successfully call the eth.personal.sign method. Looks like the typings.d.ts still needs manual tweaking, but I guess that's why they call it "beta". Thanks to both of them.

updated: the --rcapi is now deprecated, using --http.api instead


This answer is just for in case you not create the rpc provider by your own but using external provider(like: Infura, Alchemy, Pokt, ...) as they will not support --rpcapi personal (Actually, all methods with private key are not supported).

So instead of web3.eth.personal.sign you can sign it locally using:

web3.eth.accounts.sign(message, privateKey)

And get the signature from it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.