Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 96c3980

Browse files
author
shadowy-pycoder
committed
Added address creation and bitcoin message magic
1 parent 1800508 commit 96c3980

File tree

3 files changed

+209
-34
lines changed

3 files changed

+209
-34
lines changed

‎bmt/main.go‎

Lines changed: 111 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package main
22

33
import (
4-
"bytes"
54
"crypto/rand"
65
"crypto/sha256"
6+
"encoding/binary"
7+
"encoding/hex"
78
"errors"
89
"fmt"
910
"math/big"
1011
"time"
1112

13+
"github.com/btcsuite/btcd/btcutil/bech32"
1214
"github.com/btcsuite/golangcrypto/ripemd160"
1315
"github.com/mr-tron/base58"
1416
)
@@ -29,6 +31,22 @@ var (
2931
pow256 big.Int
3032
pow256M1 = pow256.Exp(two, big.NewInt(256), nil).Sub(&pow256, one)
3133
precomputes = getPrecomputes()
34+
secp256k1 = Secp256k1{
35+
PCurve: pCurve,
36+
NCurve: nCurve,
37+
ACurve: aCurve,
38+
BCurve: bCurve,
39+
GenPoint: &JacobianPoint{
40+
X: genPointX,
41+
Y: genPointY,
42+
Z: one,
43+
},
44+
}
45+
identityPoint = &JacobianPoint{
46+
X: pCurve,
47+
Y: zero,
48+
Z: one,
49+
}
3250
)
3351

3452
type JacobianPoint struct {
@@ -50,24 +68,6 @@ type Secp256k1 struct {
5068
GenPoint *JacobianPoint
5169
}
5270

53-
var secp256k1 = Secp256k1{
54-
PCurve: pCurve,
55-
NCurve: nCurve,
56-
ACurve: aCurve,
57-
BCurve: bCurve,
58-
GenPoint: &JacobianPoint{
59-
X: genPointX,
60-
Y: genPointY,
61-
Z: one,
62-
},
63-
}
64-
65-
var identityPoint = &JacobianPoint{
66-
X: pCurve,
67-
Y: zero,
68-
Z: one,
69-
}
70-
7171
// IsOdd checks if the given big.Int is odd.
7272
//
7373
// It takes a pointer to a big.Int as a parameter.
@@ -211,7 +211,7 @@ func ecDbl(p *JacobianPoint) *JacobianPoint {
211211
func getPrecomputes() []*JacobianPoint {
212212
precomputes := make([]*JacobianPoint, 256)
213213
dbl := secp256k1.GenPoint
214-
for i := range 256 {
214+
for i := range len(precomputes) {
215215
precomputes[i] = dbl
216216
dbl = ecDbl(dbl)
217217
}
@@ -338,18 +338,12 @@ func joinBytes(s ...[]byte) []byte {
338338
//
339339
// Parameters:
340340
// - privKey: a pointer to a big.Int representing the private key.
341-
// - safe: a boolean indicating whether to use a safe method for generating the public key.
342341
//
343342
// Returns:
344343
// - a pointer to a Point representing the raw public key.
345344
// - an error if the generated point is not on the curve.
346-
func createRawPubKey(privKey *big.Int, safe bool) (*Point, error) {
347-
var rawPubKey *Point
348-
if !safe {
349-
rawPubKey = ToAffine(ecMul(privKey, secp256k1.GenPoint))
350-
} else {
351-
rawPubKey = ToAffine(ecMul(privKey, nil))
352-
}
345+
func createRawPubKey(privKey *big.Int) (*Point, error) {
346+
rawPubKey := ToAffine(ecMul(privKey, nil))
353347
if !ValidPoint(rawPubKey) {
354348
return nil, errors.New("point is not on curve")
355349
}
@@ -369,12 +363,12 @@ func createRawPubKey(privKey *big.Int, safe bool) (*Point, error) {
369363
func createPubKey(rawPubKey *Point, uncompressed bool) []byte {
370364
var prefix uint8
371365
if uncompressed {
372-
return bytes.Join([][]byte{{4}, rawPubKey.X.Bytes(), rawPubKey.Y.Bytes()}, []byte(""))
366+
return joinBytes([][]byte{{0x04}, rawPubKey.X.Bytes(), rawPubKey.Y.Bytes()}...)
373367
}
374368
if IsOdd(rawPubKey.Y) {
375-
prefix = 3
369+
prefix = 0x03
376370
} else {
377-
prefix = 2
371+
prefix = 0x02
378372
}
379373
return joinBytes([][]byte{{prefix}, rawPubKey.X.Bytes()}...)
380374
}
@@ -398,17 +392,100 @@ func checkSum(v []byte) []byte {
398392
// Returns:
399393
// - a string representing the Bitcoin address.
400394
func createAddress(pubKey []byte) string {
401-
address := joinBytes([][]byte{{0}, Ripemd160SHA256(pubKey)}...)
395+
address := joinBytes([][]byte{{0x00}, Ripemd160SHA256(pubKey)}...)
402396
return base58.Encode(joinBytes([][]byte{address, checkSum(address)}...))
403397
}
404398

399+
// createNestedSegwit generates a nested SegWit Bitcoin address from a given public key.
400+
//
401+
// Parameters:
402+
// - pubKey: a byte slice representing the public key.
403+
//
404+
// Returns:
405+
// - a string representing the nested SegWit Bitcoin address.
406+
func createNestedSegwit(pubKey []byte) string {
407+
address := joinBytes([][]byte{{0x05}, Ripemd160SHA256(joinBytes([][]byte{{0x00, 0x14}, Ripemd160SHA256(pubKey)}...))}...)
408+
return base58.Encode(joinBytes([][]byte{address, checkSum(address)}...))
409+
}
410+
411+
// createNativeSegwit generates a native SegWit Bitcoin address from a given public key.
412+
//
413+
// Parameters:
414+
// - pubKey: a byte slice representing the public key.
415+
// Returns:
416+
// - a string representing the native SegWit Bitcoin address.
417+
func createNativeSegwit(pubKey []byte) (string, error) {
418+
converted, err := bech32.ConvertBits(Ripemd160SHA256(pubKey), 8, 5, true)
419+
if err != nil {
420+
return "", err
421+
}
422+
combined := make([]byte, len(converted)+1)
423+
combined[0] = byte(0)
424+
copy(combined[1:], converted)
425+
return bech32.Encode("bc", combined)
426+
}
427+
428+
// varInt generates a variable-length integer in bytes based on the input length.
429+
//
430+
// Parameters:
431+
// - length: an unsigned 64-bit integer representing the length to be encoded.
432+
//
433+
// Returns:
434+
// - a byte slice representing the variable-length integer in bytes.
435+
//
436+
// https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
437+
func varInt(length uint64) []byte {
438+
var lenBytes int
439+
var prefix byte
440+
441+
if length < 0xFD {
442+
return []byte{uint8(length)}
443+
}
444+
if length <= 0xFFFF {
445+
lenBytes = 2
446+
prefix = 0xFD
447+
} else if length <= 0xFFFFFFFF {
448+
lenBytes = 4
449+
prefix = 0xFE
450+
} else if length <= 0xFFFFFFFFFFFFFFFF {
451+
lenBytes = 8
452+
prefix = 0xFF
453+
}
454+
bs := make([]byte, 9)
455+
bs[0] = prefix
456+
binary.LittleEndian.PutUint64(bs[1:], length)
457+
return bs[:lenBytes+1]
458+
}
459+
460+
// msgMagic generates a Bitcoin message magic byte sequence from the given message.
461+
//
462+
// Parameters:
463+
// - msg: a string representing the message.
464+
//
465+
// Returns:
466+
// - A byte slice representing the Bitcoin message magic byte sequence.
467+
//
468+
// https://bitcoin.stackexchange.com/questions/77324/how-are-bitcoin-signed-messages-generated
469+
func msgMagic(msg string) []byte {
470+
message := []byte(msg)
471+
return joinBytes([][]byte{{0x18}, []byte("Bitcoin Signed Message\n"), varInt(uint64(len(message))), message}...)
472+
}
473+
405474
func main() {
406475

407476
key := big.NewInt(1000)
408477
start := time.Now()
409-
raw, _ := createRawPubKey(key, false)
410-
pk := createPubKey(raw, true)
478+
raw, _ := createRawPubKey(key)
479+
pk := createPubKey(raw, false)
411480
fmt.Println(createAddress(pk))
481+
fmt.Println(createNestedSegwit(pk))
482+
fmt.Println(hex.EncodeToString([]byte{5, 00, 20}))
483+
addr, _ := createNativeSegwit(pk)
484+
fmt.Println(addr)
485+
fmt.Printf("uint64: %v\n", uint64(18446744073709551615))
486+
487+
fmt.Println(hex.EncodeToString(varInt(12356333474345788523)))
412488
fmt.Println(time.Since(start))
489+
fmt.Println(hex.EncodeToString(msgMagic("语言处理")))
413490

414491
}

‎go.mod‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/shadowy-pycoder/go-bitcoin-message-tool
33
go 1.22.0
44

55
require (
6+
github.com/btcsuite/btcd/btcutil v1.1.5
67
github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8
78
github.com/mr-tron/base58 v1.2.0
89
)

‎go.sum‎

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,101 @@
1+
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
2+
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
3+
github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=
4+
github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A=
5+
github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=
6+
github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
7+
github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A=
8+
github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE=
9+
github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8=
10+
github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00=
11+
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
12+
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
13+
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
14+
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
15+
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
16+
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
117
github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 h1:nOsAWScwueMVk/VLm/dvQQD7DuanyvAUb6B3P3eT274=
218
github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8/go.mod h1:tYvUd8KLhm/oXvUeSEs2VlLghFjQt9+ZaF9ghH0JNjc=
19+
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
20+
github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=
21+
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
22+
github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
23+
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
24+
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
25+
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
26+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
27+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
28+
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
29+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
30+
github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
31+
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
32+
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
33+
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
34+
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
35+
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
36+
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
37+
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
38+
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
39+
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
40+
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
41+
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
42+
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
43+
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
44+
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
45+
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
46+
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
47+
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
48+
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
49+
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
350
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
451
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
52+
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
53+
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
54+
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
55+
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
56+
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
57+
github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
58+
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
59+
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
60+
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
61+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
62+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
63+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
64+
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
65+
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
66+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
67+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
68+
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
69+
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
70+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
71+
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
72+
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
73+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
74+
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
75+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
76+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
77+
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
78+
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
79+
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
80+
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
81+
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
82+
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
83+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
84+
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
85+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
86+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
87+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
88+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
89+
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
90+
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
91+
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
92+
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
93+
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
94+
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
95+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
96+
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
97+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
98+
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
99+
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
100+
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
101+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /