——golang学习日志12.8
一、变量
- 变量 = 变量名+值+数据类型
- 变量声明语法:var+变量名+数据类型
二、变量使用方法
1. 指定变量类型
var i int
fmt.Println("i=", i)
输出结果为i = 0,因为没有给i赋值,int类型的系统默认值为0,string为空串,float默认也为0.
2. 类型推导
var i = 6.66
fmt.Println("i=",i)
输出结果为i = 6.66,系统会根据值自行判定变量类型
3. 省略var
name := "tom"
Println("name=",name)
输出为name = tom,要注意的是 := 的 : 千万不能省略,name := “tom” 等价于 var name string name = “tom” 且 :=左侧的变量不应该是已经声明过的,否则会出错
三、多变量声明
用法如下:
//方式1
var n1, n2, n3 int
fmt.Println("n1=", n1, "n2=", n2, "n3=", n3)
//方式2
var a1, name1, a2 = 1, "shuaige", 3
fmt.Println("a1=", a1, "name1=", name1, "a2=", a2)
//方式3
b1, name2, b2 := 3, "tom", 5
fmt.Println("b1=", b1, "name2=", name2, "b2=", b2)
结果如图:
变量使用注意事项
同一类型的变量可在该类型数值范围内不断变化
//变量使用注意事项
var i int = 10
i = 30
i = 50
fmt.Println("i=",i) //此处i的输出为50,多个同类型值以最后一个为准
// i = 1.2
// fmt.Println("i=",i)这儿就会报错,因为i为int型
程序中+号的使用
- 若+号两边都是数值型时,则作加法运算
- 若+号两边都是字符串,则作字符串凭借
func main(){
var n1 = 234
var n2 = 462
var sum = n1 + n2
fmt.Println("sum=",sum)
var str1 = "lyong"
var str2 = "henshuai"
var str = str1 + str2
fmt.Println("str=",str)
}
——区块链密码学基础
比特币用到了密码学的两个功能,一个是哈希函数,另一个是签名
一、哈希函数
比特币采用的哈希函数是SHA-256(secure hash algorithm),本文主要记述哈希函数应用于比特币的三大特点
1. collision resistance
哈希碰撞是指当输入不同,却产生了相同哈希值的冲突,但这种碰撞很难人为制造,所以说哈希函数一般都是collision resistance(抗碰撞性),但没法证明哈希函数是严格collision free,即不会发生碰撞的。此特点可应用于验证文件是否被篡改,比如在上传一个文件前,先算出此文件的哈希值,保存在本地,当从云端下载文件时,再计算一次哈希值,将两次的哈希值比较即可知晓文件是否被篡改。
2. hiding
hiding指单向不可逆性,即给定一个x,可很容易推出h(x),但给定一个h(x)却很难推出x,除非蛮力破解,在实际应用中应尽量使输入空间足够大,分布尽可能均匀。
3. puzzle friendly
由于哈希值的计算是不可预测的,如果想要h(x)落在某范围内,没有其他的好方式,只能一个一个去试,去找这个随机数,而找这个随机数可用作工作量证明——Pow,即存在某个随机数nonce,使得H(block header)<= target。
二、签名
普通的加密算法为symmetric encryption algorithm(对称加密),即采用同一把密钥进行加密和解密,缺点是密钥分发不是很方便。
比特币采用的加密算法是asymmetric encryption algorithm(非对称加密),即采用一对密钥,公钥+私钥,公钥用于加密,私钥用于解密。
在比特币区块链中,私钥代表了对比特币的控制权。交易发起方用私钥对交易(包括转账金额和转账地址)签名并将签名后的交易和公钥广播,各节点接收到交易后均可以用公钥验证交易是否合法。在此过程中交易发起方不需要暴露自己的私钥,从而实现了保密目的。