区块链学习笔记(一)

这几天参加了一个区块链培训,觉得挺有用的,为了方便自己以后再用到,于是决定把它记录在我的博客上,也希望能给想学区块链的朋友们提供一点帮助 (至少不会走我踩过的坑)

钱包的安装

首先你需要安装 MetaMask,这是一个 Chrome 插件钱包(也有火狐的,安卓和 ios 也有测试版),百度直接搜索 MetaMask ,然后到官网下就可以,不过谷歌商店需要翻墙,不会翻墙的可以从 github 里下载,选择最新版本的zip压缩包下载并解压。

点击浏览器右上角三个竖着的点,选择更多工具->扩展程序,所有安装的插件都在这里,开启开发者模式,加载我们解压后的文件, MetaMask 就安装完了。

然后你会在浏览器的右上角看到一个小狐狸一样的图标这就代表这个插件已经正常安装了。

创建新的账户

首先你要知道,钱包里的以太币那是真的钱,因此不要随便乱操作,我们的培训是在一个学校搭建的测试节点上进行的,所以上面的钱都是假的,因此一定要看清当前网络是以太主网还是自己私有的网络节点,要使用测试节点,先点击右上角头像的左边,选择自定义 RPC ,配置需要根据实际情况,可以参考我下面的配置。

然后创建账户我这边没有图,大家按照提示做就行了,不过一定要记住自己设置的密码和生成的助记词(最好找个安全的地方存着)。

这里注意下私钥是存储在浏览器里的,浏览器数据清掉了也会没了,所以注意保管好,别人也可以通过你的浏览器来获得你的账户。

转账与添加代币

转账很简单,点击右上角发送,然后输入对方地址,选择要转得代币及金额,选择合适的 gas fee ,这里讲几个概念,gas fee 就是下面的交易费,点击高级选项,你可以看到 gas price 和 gas limit,前者就是油价,油价越高,你的交易优先度越高,也就越快,后者是你限制的最高消耗,区块链上的如转账等操作都需要消耗资源(gas),gas fee 将会付给帮你完成这些操作的矿工,gas fee = gas price * gas used,由于你实际消耗的的 gas 有多少只有完成后才知道,所以一开始需要你提供一个 gas limlit ,多付的交易费会退还给你。

你要使用其他代币时,你需要自己添加,点击添加代币,然后你可以直接搜索,不过一般有好多一样的,或者点击自定义,将代币合约的地址填进去,然后添加。你可以从 Etherscan 查看到所有人账户的详情(你要看自己的可以直接点头像下面详情 -> 在Etherscan 查看),每笔交易的详情,以及合约的详情,只要你知道对应的地址(交易的那个叫 txid )就可以查到,这就是区块链最重要的特点之一公开性或者说透明性,不过这个网站要翻墙,下面我们看看交易的详情是怎么样的。

将信息永远保留在链上

这个是我们第一天的作业,你只需要将你想保留的信息(如你的名字)转换成 16 进制,放在 input data 里即可,那么问题来了,如何放进去呢,我们这里采用的是调用 RPC 来实现操作,这里提供两种思路,第一种比较复杂也是我采用的方法,参考 rpc 的官方文档,通过 postman(这个自己安装吧,直接百度找官网就行了)来发送 request。

首先我们在官方文档里找到怎么转账,这里我们用 personal_sendTransaction(我一开始用 eth_sendTransaction 不过没成功,但应该也可以,只不过要注意用 eth 这个之前每次都要解锁一次),下面是官方文档的代码,不过先别着急试,先往后看。

{"method":"personal_sendTransaction",
"params":[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1",//转出地址
"to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",//转入地址
"data":"0x41cd5add4fd13ae",//这里的东西将会在input data里出现,所以将信息转化成16进制放到这就行了
"value":"0x186a0"},        //转账的金额
"hunter2"],                //这个是转出账户的密码
"id":1,                    //这个根据实际情况改吧
"jsonrpc":"2.0"}

如果你试过了就会发现点问题,其实我们在交易时,是用私钥将账户短暂的解锁,然后再进行交易的,所以我们在交易前就要先解锁,这里我们使用 personal_unlockAccount。

{"method":"personal_unlockAccount",
"params":["0x8f0227d45853a50eefd48dd4fec25d5b3fd2295e",//解锁账户的地址
"hunter2",                 //账户的密码
null],
"id":1,                    //同上
"jsonrpc":"2.0"}

你有没有发现一个问题,既然是用私钥解锁,那么我们怎么提交私钥呢,这个有点麻烦,一种方法,将你的私钥直接导入节点里,这样就可以直接用上面的方法解锁了,但这样你的账户也就相当于公开了,第二种方法,通过调用 rpc 新建一个账户,这个账户的私钥将会直接放在节点中,我们通过这个账户中转来完成转账。新建账户我们用 personal_newAccount。

{"method":"personal_newAccount",
"params":["hunter2"],           //这里的hunter2是密码
"id":1,
"jsonrpc":"2.0"}

运行后返回的 Response 如下,其中 result 就是新账户的地址

{
  "id": 1,
  "jsonrpc": "2.0",
  "result": "0x8f0227d45853a50eefd48dd4fec25d5b3fd2295e"
}

给大家看看最后的结果,我成功将我的名字永恒留在了节点中,没有人可以修改或者删除。

之前说过有两种思路,第二种就是通过 python 调用 web3 库,这个方法更简单,不过因为我装 web3 模块好像出了点问题,应该是路径的关系,import web3 会报错(解释器没有找到 web3 模块在哪里),我没时间去研究问题在哪,所以不了了之了,不过我还是提供一下代码。

​
provider = Web3.HTTPProvider('http://starry-tokyo4-1.vgu.io:2048')
​
web3 = Web3(provider)
​
myaccount="0xe4E424bbD4667c448D235207DA601824158EE7C1" #换成自己的account
​
targetaccount="0x8B6a5bf45a141906fa0f7670172DfD4f06FF1935"
​
private_key="5EB3980E9422B49C752048B6800559FA8470C6C447947180CFD92127AFAA3474"#换成自己的私钥
​
nonce = web3.eth.getTransactionCount(myaccount)
​
tx = {
    'nonce':nonce,
    'to':targetaccount,
    'value':web3.toWei(0.001,'ether'),
    'gas':200000,
    'gasPrice':web3.toWei('8','gwei'),
    'data':"0xe78e8be79bb8e8998e0a",
}
​
signed_tx=web3.eth.account.signTransaction(tx,private_key)
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
print(web3.toHex(tx_hash))
​