create account

实现地址 / go实现简易区块链 #6 by lemooljiang

View this thread on: hive.blogpeakd.comecency.com
· @lemooljiang · (edited)
$9.44
实现地址 / go实现简易区块链 #6
比特币钱包中并不像普通帐户那样真的有钱,而是公私钥的集合。先来定义钱包(wallet)的结构:

```go
type Wallet struct {
	PrivateKey ecdsa.PrivateKey
	PublicKey  []byte
}
type Wallets struct {
	Wallets map[string]*Wallet
}
func NewWallet() *Wallet {
	private, public := newKeyPair()
	wallet := Wallet{private, public}
	return &wallet
}
func newKeyPair() (ecdsa.PrivateKey, []byte) {
	curve := elliptic.P256()
	private, err := ecdsa.GenerateKey(curve, rand.Reader)
	pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...)
	return *private, pubKey
}
```

可见钱包中除了密钥对,其它什么也没有。现在需要Wallets类型来维护这起集合。

```go
//运算地址
func (w Wallet) GetAddress() []byte {
	pubKeyHash := HashPubKey(w.PublicKey)
	versionedPayload := append([]byte{version}, pubKeyHash...)
	checksum := checksum(versionedPayload)
	fullPayload := append(versionedPayload, checksum...)
	address := Base58Encode(fullPayload)
	return address
}

func HashPubKey(pubKey []byte) []byte {
	publicSHA256 := sha256.Sum256(pubKey)
	RIPEMD160Hasher := ripemd160.New()
	_, err := RIPEMD160Hasher.Write(publicSHA256[:])
	publicRIPEMD160 := RIPEMD160Hasher.Sum(nil)
	return publicRIPEMD160
}
func checksum(payload []byte) []byte {
	firstSHA := sha256.Sum256(payload)
	secondSHA := sha256.Sum256(firstSHA[:])
	return secondSHA[:addressChecksumLen]
}
```

`GetAddress()`把公钥进行一系列转换,得到地址,如果公开,别人就可以向它转帐了。转换的地址步骤如下:
1. 获取公钥,使用RIPEMD160(SHA256(PubKey))执行两次hash算法。
2. 给hash加上地址生成算法版本
3. 使用SHA256(SHA256(payload))hash计算第2步的结果,得到的hash值前4bytes就是校验码。
4. 把校验码附加到version+PubKeyHash组合。
5. 使用Base58编码version+PubKeyHash+checksum组合

![address.jpg](https://ipfs.ilark.io/ipfs/QmfHPFL2nTh8JMADp65m2sBKP8N64vEDXY3eozMcAZ45zZ)

最后,算出了一个真正的比特币地址。如果你在不连网的情况下在本地运算,得到的公私钥对就是常说的冷钱包。它具有最高的安全性。如果你把私钥放到了服务器上以进行一些自动转账的功能,比如交易所,这就是热钱包。如果服务器被黑客成功攻击,私钥被泄露,比特币就成别人的了!所以,才有很多人说,私钥即一切!
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
👎  
properties (23)
authorlemooljiang
permlinkkndzdlpe
categoryhive-105017
json_metadata{"tags":["cn","cn-reader","blockchain","bitcoin","wallet"],"dapp":"larkBlog","format":"markdown"}
created2022-08-30 12:09:27
last_update2022-08-31 04:09:09
depth0
children2
last_payout2022-09-06 12:09:27
cashout_time1969-12-31 23:59:59
total_payout_value4.730 HBD
curator_payout_value4.713 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length1,768
author_reputation378,633,553,904,979
root_title"实现地址 / go实现简易区块链 #6"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id116,166,223
net_rshares13,327,824,505,309
author_curate_reward""
vote details (66)
@annepink ·
@tipu curate
properties (22)
authorannepink
permlinkre-lemooljiang-2022830t215026744z
categoryhive-105017
json_metadata{"tags":["cn","cn-reader","blockchain","bitcoin","wallet"],"app":"ecency/3.0.26-vision","format":"markdown+html"}
created2022-08-30 13:50:27
last_update2022-08-30 13:50:27
depth1
children1
last_payout2022-09-06 13:50:27
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length12
author_reputation789,929,037,264,292
root_title"实现地址 / go实现简易区块链 #6"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id116,168,519
net_rshares0
@tipu ·
<a href="https://tipu.online/hive_curator?annepink" target="_blank">Upvoted  &#128076;</a> (Mana: 0/37) <a href="https://peakd.com/hive/@reward.app/reward-app-quick-guide-updated" target="_blank">Liquid rewards</a>.
properties (22)
authortipu
permlinkre-re-lemooljiang-2022830t215026744z-20220830t135034z
categoryhive-105017
json_metadata"{"app": "beem/0.24.26"}"
created2022-08-30 13:50:33
last_update2022-08-30 13:50:33
depth2
children0
last_payout2022-09-06 13:50:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length215
author_reputation55,206,712,148,211
root_title"实现地址 / go实现简易区块链 #6"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id116,168,523
net_rshares0