您正在查看: Surou 发布的文章

比特币多签和脚本调研

调研背景

公司有个针对比特币的资产使用场景,

一个比特币的账户有5个多签见证人控制,满足3个人签名就可以修改其中一个人的签名权限,和转移50%的资产,满足5个人同时签名就可以转移100%的资产。

之前一直All in EOS,所以先查下相关的资料吧。

参考资料

https://www.qunfengshe.com/articles/QXJ0aWNsZTo4MA==
https://zhuanlan.zhihu.com/p/25461051
https://m.8btc.com/article/350625
https://juejin.im/post/5aa60e65518825557005a7f6
https://en.bitcoin.it/wiki/Script#Opcodes
https://github.com/bitcoin/bitcoin/blob/master/src/script/interpreter.cpp
https://gist.github.com/gavinandresen/3966071
https://siminchen.github.io/bitcoinIDE/build/editor.html

对比EOS

按需求我们等价到EOS链图灵完备的智能合约实现方式,需要以下几步

  1. 准备一个资产账户,5个管理账户,并将资产账户active和owner的权限按权重(5)和阈值(3)设置成5个管理账户(set account permission),且能满足达到3/5权重,再次修改账户权限。
  2. 编写智能合约,Table中记录当前资产总额和已转出的资产,合约“监听”转账通知 [[eosio::on_notify("eosio.token::transfer")]],当有新转入,累加到资产总额。当已转出的资产超过50%时,验证当前执行是否同时有5个账户的签名 require_auth(1) - require_auth(5),如果不满足则失败assert,没超过50%前,无需合约判断,链本身会在第一步设置的资产账户的权重和阈值那里自行判断,也就是至少满足3/5才会执行到此合约里。
  3. 将上面的合约部署到资产账户,就能满足需求场景了。

调研针对比特币的需求结论

  1. 针对权重和阈值分配,比特币多重签名可以支持。但相对EOS权限管理,只能等份分割,某个人想拥有多大比例的权重,就拥有对应个数的私钥。
  2. 比特币脚本不是图灵完备的,无法实现数据存储,只能做一些简单的堆栈方式的运算,且当合约执行时,它没办法指定被影响到的比特币金额,要么全部解锁,要么就完全不解锁,因为比特币上的智能合约只是一个锁定脚本,成功解锁前后,没有中间状态,导致实现复杂协议很困难。

考虑到使用场景,比特币简单粗暴临时方案

使用权重和阈值 分别是5-5,以及5-3,创建两个比特币地址。5-5账户地址存放100%资金,由5个人同时签名后将资金的 50%转移到 5-3账户地址。这样能满足 5-5可使用100%资金,5-3使用50%资金。相对资产单一账户来说,超过单个账户余额边界时,会导致2笔手续费。

idea 使用中遇到的坑,持续总结

常见问题

  1. META-INF 修改路径为
    src/main/resources
  2. 编辑 META-INF\MANIFEST.MF,不然被三方加载,启动时找不到主类
    Main-Class: Main

参考

https://www.cnblogs.com/Bruce_H21/p/9909198.html

解决Unexpected end of JSON input while parsing near 问题

终端执行命令npm cache clean --force
完成后再执行命令npm install

EOS 内联操作后,立即查询数据未更新

问题

老同事今天问我,A合约inline调用B合约的action(B合约的action中的逻辑会修改B合约的某个Table),A合约中执行完inline后,立刻查B合约中的Table数据,数据未更新,怎么处理。

解决方案

A合约inline调用B合约的action后,B再内联调用A合约的另一个新加的action(在这个action中再查B合约的Table数据)

先暂时记录下,等下再跟下链代码,详细分析下为什么合约是同步执行的,然而inline action 出现了“异步的效果”

Install MySQL 8 on Windows 10 64bit

下载

下载地址:https://dev.mysql.com/downloads/mysql/8.0.html

1.解压

mysql-8.0.19-winx64.zip

演示文件目录

C:\Program Files\mysql-8.0.19-winx64

2.创建两个文件夹

C:\Program Files\mysql-8.0.19-winx64\data
C:\Program Files\mysql-8.0.19-winx64\logs

3.设置环境变量

4.新建my.ini配置

[mysqld]
#安装目录
basedir = C:\Program Files\mysql-8.0.19-winx64
#数据文件目录
datadir = C:\Program Files\mysql-8.0.19-winx64\data
port = 3306
server_id = 1
general_log = ON
general_log_file = C:\Program Files\mysql-8.0.19-winx64\logs\mysql.log
log_error = C:\Program Files\mysql-8.0.19-winx64\logs\error.log
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
character-set-server = utf8mb4
performance_schema_max_table_instances = 600
table_definition_cache = 400
table_open_cache = 256
#sql_mode=ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES
[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

5.管理员权限开启CMD窗口

5.1 初始化
mysqld --initialize --console #不用特别指定default file默认会使用my.ini

控制台输入如下表示成功

C:\Program Files\mysql-8.0.19-winx64>mysqld --initialize --console
2020-04-21T10:11:25.148253Z 0 [Warning] [MY-010915] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2020-04-21T10:11:25.148318Z 0 [System] [MY-013169] [Server] C:\Program Files\mysql-8.0.19-winx64\bin\mysqld.exe (mysqld 8.0.19) initializing of server in progress as process 8684
2020-04-21T10:11:47.571686Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Fv?_a7%jn_R(

Warning暂时没做理会,没发现使用异常
记下上面日志最后面的root的初始化密码Fv?_a7%jn_R(,下面要用到

5.2 安装服务
mysqld --install [服务名] #不写服务名默认为mysql
5.3 启动数据库
C:\Program Files\mysql-8.0.19-winx64>net start mysql
MySQL 服务正在启动 ..
MySQL 服务已经启动成功。
5.4 使用临时密码登陆数据库
C:\Program Files\mysql-8.0.19-winx64>mysql -u root -p
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.19

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
5.5 修改root初始化密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '要改的新密码';