Upgrade to Pro — share decks privately, control downloads, hide ads and more …

hd-wallet.pdf

koganezawa
October 23, 2018
210

 hd-wallet.pdf

koganezawa

October 23, 2018
Tweet

Transcript

  1. Abount Me • Twi%er ˏkogane5513 • 2018/10ʙɹϚωʔϑΥϫʔυϑΟφϯγϟϧ • Ծ૝௨՟औҾॴͷ৽ن։ઃʹ޲͚ͯฃಆதʂ •

    ʙ2018/9 • ʢגʣSmartDrive • ৽نࣄۀ։ൃ • freee גࣜձࣾʢϑϦʔʣ • ܾࡁɺೝূج൫νʔϜ
  2. ຊ೔ͷ಺༰ • ֊૚తܾఆੑ΢ΥϨοτͱ͸(BIP32,44) • ֊૚తܾఆੑ΢ΥϨοτͷ࣮૷ • Mul.Sig Addressͷ࣮૷ ࢖༻ݴޠɿGolang ࢖༻ϥΠϒϥϦʔɿbtcsuite/btcu/l

    import ( "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcu/l/hdkeychain" "github.com/btcsuite/btcd/txscript" )
  3. ֊૚తܾఆੑ΢ΥϨοτͱ͸(BIP32,BIP44) ϚελʔͳΔγʔυ஋͔Βɺm/i/0/kͷΑ͏ͳ֊૚ߏ଄తʹൿີ伴Λੜ੒ɾ؅ཧͰ͖Δඪ४ن֨Ͱ͢ɻ ʢHierarchical Determinis2c Wallet = HD Walletʣ ௨ৗͷ΢ΥϨοτͰ͸ɺ࢖༻ࡁΈͷൿີ伴ͱެ։伴ͷϖΞΛఆظతʹɺ͢΂ͯόοΫΞοϓ͓ͯ͘͠ඞཁ͕͋Γ·͕ͨ͠ɺBIP32Ͱ ඪ४Խ͞ΕͨϓϩτίϧΛར༻͢Δ͜ͱͰɺϚελʔγʔυ͑͞อଘ͞Ε͍ͯΕ͹ɺ͔ͦ͜Β೿ੜ͢Δൿີ伴Λ͍࣋ͬͯͳͯ͘΋Π

    ϯσοΫεΛࢦఆ͢Δ͜ͱͰɺҟͳΔγεςϜ͔Β͍ͭͰ΋࠶ར༻͢Δ͜ͱ͕Ͱ͖·͢ɻ ϏοτίΠϯίΞʹ΋v0.13.0͔Βಋೖ͞Εɺਖ਼ࣜʹαϙʔτ͞ΕΔΑ͏ʹͳΓ·ͨ͠ɻ ͭ·ΓɺHD Walletͷن֨Ͱੜ੒͞Εͨൿີ伴Ͱ͋Ε͹ɺSeed͑͋͞Ε͹෮ݩɺ࠶ར༻ՄೳͱͳΓӡ༻ָ͕ʹͳΔͱ͍͏΋ͷɻ 1ݸͷཚ਺͔ΒπϦʔߏ଄తʹଟ਺ΞυϨεʢൿີ伴ɺެ։伴ʣΛੜ੒Ͱ͖·͢ɻ Լه͸ɺ֊૚Խ͞ΕͨύεͷΠϝʔδͰ͢ɻ • BIP32 Path level:Ϛελʔ / ΞΧ΢ϯτ' / ࢧ෷͍ or ͓௼Γ / ΞυϨε • BIP44 Path level: Ϛελʔ / ࢓༷(BIP)' / ௨՟' / ΞΧ΢ϯτ' / ࢧ෷͍ or ͓௼Γ / ΞυϨε
  4. ֊૚తܾఆੑ΢ΥϨοτͱ͸(BIP32,BIP44) ֊૚ผʹΑΔ࢓༷͸ԼهʹͳΓ·͢ɻ m: Ϛελʔ伴 purpose: ໨త֊૚ 44ʹઃఆ͞Εͨఆ਺ cointype: ίΠϯͷछྨ֊૚ɻ௨՟ຖʹεϖʔε͕ܾΊΒΕ͍ͯΔ account:

    ࢖༻໨త֊૚ɻد෇໨త / ஷ஝໨త / ڞ௨ܦඅ ͳͲ࢖༻͢ΔϢʔβʔଆͰܾΊΔ͜ͱ͕Ͱ͖Δ change: डऔ֊૚ɻ֎෦ૹۚऀʢExternalʣ͔ΒͷडऔΓ͕0 / ࣗ਎ʢInternalʣͷτϥϯβΫγϣϯ͔Βͷ͓ͭΓͷडऔΓ͕1 addressindex: ΞυϨε֊૚ɻΠϯσοΫε஋͕ৼΒΕΔ Coin types Path Examples
  5. Mul$Sig Addressͷ࣮૷ // AddressPubKeyを使ってredeemScriptを作成する addressPubKeys := []*btcutil.AddressPubKey{addressPubKey1, addressPubKey2} // 2

    of 2 redeemScript, err := txscript.MultiSigScript(addressPubKeys, len(addressPubKeys)) if err != nil { return err } // redeemScriptよりMultiSig adddressを作成する ad, err := btcutil.NewAddressScriptHash(redeemScript, &chaincfg.MainNetParams) if err != nil { return err } addr := ad.EncodeAddress()
  6. Mul$Sig Addressͷ࣮૷ func MultiSigScript(pubkeys []*btcutil.AddressPubKey, nrequired int) ([]byte, error) {

    if len(pubkeys) < nrequired { str := fmt.Sprintf("unable to generate multisig script with "+ "%d required signatures when there are only %d public "+ "keys available", nrequired, len(pubkeys)) return nil, scriptError(ErrTooManyRequiredSigs, str) } builder := NewScriptBuilder().AddInt64(int64(nrequired)) for _, key := range pubkeys { builder.AddData(key.ScriptAddress()) } builder.AddInt64(int64(len(pubkeys))) builder.AddOp(OP_CHECKMULTISIG) return builder.Script() }