Giter Site home page Giter Site logo

bip39's Introduction

BIP39

Dart implementation of Bitcoin BIP39: Mnemonic code for generating deterministic keys

Convert from bitcoinjs/bip39

Reminder for developers

Please remember to allow recovery from mnemonic phrases that have invalid checksums (or that you don't have the wordlist)

When a checksum is invalid, warn the user that the phrase is not something generated by your app, and ask if they would like to use it anyway. This way, your app only needs to hold the wordlists for your supported languages, but you can recover phrases made by other apps in other languages.

However, there should be other checks in place, such as checking to make sure the user is inputting 12 words or more separated by a space.

Examples

// Generate a random mnemonic (uses crypto.randomBytes under the hood), defaults to 128-bits of entropy
var mnemonic = bip39.generateMnemonic()
// => 'seed sock milk update focus rotate barely fade car face mechanic mercy'

bip39.mnemonicToSeedHex('basket actual')
// => String '5cf2d4a8b0355e90295bdfc565a022a409af063d5365bb57bf74d9528f494bfa4400f53d8349b80fdae44082d7f9541e1dba2b003bcfec9d0d53781ca676651f'

bip39.mnemonicToSeed('basket actual')
// => Uint8List [92, 242, 212, 168, 176, 53, 94, 144, 41, 91, 223, 197, 101, 160, 34, 164, 9, 175, 6, 61, 83, 101, 187, 87, 191, 116, 217, 82, 143, 73, 75, 250, 68, 0, 245, 61, 131, 73, 184, 15, 218, 228, 64, 130, 215, 249, 84, 30, 29, 186, 43, 0, 59, 207, 236, 157, 13, 83, 120, 28, 166, 118, 101, 31]

bip39.validateMnemonic(mnemonic)
// => true

bip39.validateMnemonic('basket actual')
// => false
import 'package:bip39/bip39.dart' as bip39;

main() {
    // Only support BIP39 English word list
    // uses HEX strings for entropy
    String randomMnemonic = await bip39.generateMnemonic();

    String seed = bip39.mnemonicToSeedHex("update elbow source spin squeeze horror world become oak assist bomb nuclear");
    // => '77e6a9b1236d6b53eaa64e2727b5808a55ce09eb899e1938ed55ef5d4f8153170a2c8f4674eb94ce58be7b75922e48e6e56582d806253bd3d72f4b3d896738a4'
    
    String mnemonic = await bip39.entropyToMnemonic('00000000000000000000000000000000');
    // => 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'
    
    bool isValid = await bip39.validateMnemonic(mnemonic);
    // => true
    
    isValid = await bip39.validateMnemonic('basket actual');
    // => false
    
    String entropy = bip39.mnemonicToEntropy(mnemonic)
    // => String '00000000000000000000000000000000'
}

bip39's People

Contributors

anicdh avatar longhoangwkm avatar ookami-kb avatar sfzxc avatar vdeurzen avatar willyfromtheblock avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

bip39's Issues

Derrived address different then expected

Hey, I am using this library to derive accounts from the deprivation path of m/44'/60'/0'/0/0 which works fine, but when I derive path with m/44'/60'/0'/0/1 it is inconsistent with what we get from metamask or other applications.

I am using this mnemonic company loud estate century olive gun tribe pulse bread play addict amount

0th address if fine which is 0x2Ee331840018465bD7Fe74aA4E442b9EA407fBBE
from 1st address it gives different account then expected, it should give 0x97F5aE30eEdd5C3c531C97E41386618b1831Cb7b but its giving 0xeeed912ce027042b94ea6288001c27541d2cc59b
You can check accounts with this site https://iancoleman.io/bip39/

I am using this snippet to derive account

    final root = bip32.BIP32.fromSeed(HEX.decode(seed));
    final child1 = root.derivePath("m/44'/60'/0'/0/1");
    final privateKey = HEX.encode(child1.privateKey);
    final private = EthPrivateKey.fromHex(privateKey);
    final address = await private.extractAddress();```

Chinese mnemonic

I am currently facing an issue converting Chinese mnemonics to hex. The returned string does not match the intended result. Everything works fine when attempting on English. Thanks in advance.

String plainText = "成 山 何 阀 臣 愈 梅 握 厂 坑 磷 正 熊 紧 簧";
String seedHex = bip39.mnemonicToSeedHex(plainText);
// result: f9efae87296519949ddecfb4fecf59beec3a1bb71ecfd3452aa653c5d9d9af9cfe017916a000151527b22ee79a86b0a24836b024696534fa2a8c0ca403540533

// intended result:
41656441c5621160d8d67aa48a99818e1bb0ef9668d20f22b6129662e14a7ad8b8ed2125c66516bbb3bc96ce109cd919a69c60c7263c6eafb1fb9032d6749556

ethereum

How check its unvalid for which substring?

Project maintenance!

Hey!

Project maintenance would be nice. People appreciate your work and are willing to spend some time with your project. But you need to update the pub.dev package as well!

about null-safety

Hi.
I am wondering when the null-safety will be updated.

plz, update

pointycastle: ^2.0.0
hex: ^0.1.2

Thanks.

`_randomBytes` generates non-uniform random values

bip39.generateMnemonic uses the Random.secure() CSPRNG from the dart:math library to generate entropy for the mnemonic in _randomBytes.

Uint8List _randomBytes(int size) {
final rng = Random.secure();
final bytes = Uint8List(size);
for (var i = 0; i < size; i++) {
bytes[i] = rng.nextInt(_SIZE_BYTE);
}
return bytes;
}

Here _SIZE_BYTE is defined as 255 (on line 10). Since the nextInt method generates integers in the half-open interval [0, max) for a given upper bound max, the value 255 will never be generated. This means that the generated entropy will not be uniformly random. This is an issue if the library is used to generate private keys (e.g. using BIP32).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.