这篇文章主要介绍了去语言实战之实现比特币地址校验步骤,利用生产的随机数采用椭圆加密算法生成公钥,具体步骤实例代码请参考下本文
由公钥生成比特币地址步骤
随机取一个32位随机数作为私钥利用生产的随机数采用椭圆加密算法生成公钥计算公钥的sha256哈希值计算RIPEMD-160哈希值第四步结果加上版本号(比特币为0x00)对第5步结果取两次sha256哈希值取上一步结果的前四个字节将第七步结果加到第步的结果后面作为校验利用base58对第8步结果进行变化得到地址生成地址代码如下
func(w Wallet)get address()[]byte { pubKeyHash:=hash pubkey(w . public key)version edpayload:=append([]byte { version },pubkey hash.)校验和:=校验和(版本有效负载)完整有效负载:=附加(版本有效负载,校验和.)地址:=Base58Encode(完整有效负载)返回地址} func哈希pubKey(pubKey[]byte)[]byte { public sha 256:=sha 256 .sum 256(公钥)ripemd 160 hasher:=ripemd 160 .New() _,err :=RIPEMD160Hasher .write(public sha 256[:])public ripemd 160:=ripemd 160 hasher .总和(零)返回publicRIPEMD160} func校验和(有效负载[]字节)[]字节{ firstSHA :=sha256 .Sum256(有效载荷)秒SHA :=sha256 .sum 256(第一个sha[:])返回第二个sha[:addressChecksumLen]}校验比特币
地址是否正确代码
addressChecksumLen:=4 func验证地址(地址字符串)bool { pubKeyHash:=base 58 decode([]byte(address))实际校验和:=pubkey hash[len(pubkey hash)-address checksumlen:]version:=pubkey hash[0]pubkey hash=pubkey hash[1:len(pubkey hash)-address checksumlen]目标校验和:=checksum(append([]byte { version },pubkey hash.))返回字节比较(实际校验和,目标校验和)==0}Base58Decode是对比特币地址进行解码,然后取后四位校验位实际校验和,利用去掉校验位的公钥哈希再次算出校验位与地址的校验位做出对比,即可验证地址的正确性。其中用到的函数有:
功能校验和(有效负载[]字节)[] //利用两次shah256求校验位byte { firstSHA :=sha256 .Sum256(有效载荷)秒SHA :=sha256 .sum 256(第一个sha[:])返回第二个sha[:addressChecksumLen]}这是解码的函数,已经有不少现有的代码支持,故不作讲解
func base 58解码(输入[]字节)[]字节{结果:=大.new int(0)zero bytes:=0 for b:=range input { if b==0x 00 { zero bytes } } payload:=input[zero bytes:]for _,b:=range payload { char index:=bytes .索引字节(b58字母表,b)结果10000 Mul(结果,大纽因特(58岁)结果。加(结果,大. NewInt(int64(charIndex))) }解码:=结果. Bytes() decoded=append(bytes .重复([]字节{字节(0x00)},零字节),解码.)返回解码的}以上就是去语言实战之实现比特币地址校验步骤的详细内容
去语言实战之实现比特币地址校验教程| 《Linux就该这么学》(linuxprobe.com)