|
halo 大家好,俺是 132,今天给大家带来一篇重磅的文章,也就是关于 c 站终于完成了 web3 的重构,这件事
背景
c站成立于 2018 年,是一家弹幕视频网站,彼时拥有几十万注册用户,月活 100W+,热度一度赶超 a 站
但是好景不长,c 站最大的诟病就是和 b 站太像了,一个 clicli 一个 bilibili,同质化严重,憋屈死了
为了解决和 b 站同质化的问题,c 站提出了 meta 计划,也就是玩法逐渐 meta 化,将越来越多的功能迁移到 web3,也就是上链
至此,问,c 站和 b 站最大的不同是什么?答:c 站是 web3,b 站是 web2
开搞
第一步,从合约开始:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract MyERC20 {
string public name = &#34;CliCli&#34;;
string public symbol = &#34;CCB&#34;;
uint8 public decimals = 6;
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
constructor(uint256 total) {
totalSupply = total;
balanceOf[msg.sender] = total;
}
function transfer(
address from,
address to,
uint256 amount
) public returns (bool) {
balanceOf[from] -= amount;
balanceOf[to] += amount;
return true;
}
}一个简单的 solidity 合约长这样,如果你代码比较敏感的话,到这里其实已经可以感知到区块链本质是啥了
从代码上感知,它其实只是一个内存数据库,当然它本质上是一个分布式的数据库
第二步,go 调用合约:
这一步也是折腾最久的,因为 go-ethereum 这个包,文档实在是令人绝望
func CallContractWithAbi(client *ethclient.Client, privKey *ecdsa.PrivateKey, from, to common.Address, contract string) (string, error) {
// create tx
nonce, err := client.NonceAt(context.Background(), from, nil)
if err != nil {
fmt.Println(&#34;get nonce: &#34;, err)
return &#34;&#34;, err
}
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
fmt.Println(&#34;gas price: &#34;, err)
return &#34;&#34;, err
}
if err != nil {
fmt.Println(&#34;read file: &#34;, err)
return &#34;&#34;, err
}
contractABI, err := abi.JSON(bytes.NewReader(abiData))
if err != nil {
fmt.Println(&#34;abi json: &#34;, err)
return &#34;&#34;, err
}
amount, _ := new(big.Int).SetString(&#34;1000000&#34;, 10) //1
callData, err := contractABI.Pack(&#34;transfer&#34;, from, to, amount)
if err != nil {
fmt.Println(&#34;abi pack: &#34;, err)
return &#34;&#34;, err
}
tx := types.NewTransaction(nonce, common.HexToAddress(contract), big.NewInt(0), uint64(300000), gasPrice, callData)
// sign tx
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(big.NewInt(5)), privKey)
if err != nil {
fmt.Println(&#34;sign tx: &#34;, err)
return &#34;&#34;, err
}
// send tx
err = client.SendTransaction(context.Background(), signedTx)
if err != nil {
fmt.Println(&#34;send tx: &#34;, err)
return &#34;&#34;, err
}
return signedTx.Hash().Hex(), nil
}
值得一提的是,废了很大的力气,终于找到了一种不使用 `abigen.exe` 的合约调用方法
我真的是麻了
第三步,部署:
因为 go-etnereum 这个包需要 gcc,在 window 上可以用 minGW 或者 MSVC,附上一个 minGW 的下载地址
点我
至于 linux 上交叉编译,具体看 github action 即可
玩法
目前 c 站的 web3 的功能只有投币这一个,通俗理解,就是你投搞,我给你投币
然后因为区块链本质上是个数据库,所以除了数字货币,理论上还有很多东西可以上链
接下来 c 站会有很多 web3 的玩法,比如弹幕上链,萌战,等等,只要是新功能,基本上都是为上链做设计
最后
重要的事情说三遍:
b 站是 web2,c 站是 web3
b 站是 web2,c 站是 web3
b 站是 web2,c 站是 web3
最后附上 c 站代码仓库,大家有啥想法欢迎一起交流
GitHub - cliclitv/go-clicli: CliCli project |
|