透过源码分析Sia后台siad启动过程与密码配置
前情介绍:
SC钱包有两类方式,一类是带有UI界面的Sia-UI, 有界面操作;一类是Sia Daemon服务,只在终端里面操作。而对于大部分SC钱包开发者来说,一般只用Sia Daemon服务。该后台服务主要是siad为后台server,siac为cmd模式的client。而对于siad服务启动的选项有如下很多选项:
对于其中Flag的选项中--authenticate-api, --temp-password 与API密码配置有关,那么该怎么设置api password呢?带着这个问题,我查看了sia的源码。而看过源码后,才真正搞清楚其配置方式和得以一窥siad后台服务启动的过程。
源码分析:
首先,从官网上点击开发者文档的链接,即下面这个:
进入后,往上一层,即进入该开源项目的代码目录,其中siad,siac对应的代码就在cmd目录下,build涉及的一些版本号,系统路径设置等。
点击siad,即可进入一睹siad源码了。这里主要三两个文件,main.go,server.go和daemon.go。启动main在main.go文件中实现,其中数据结构Config定义了siad支持的各种输入参数,这个和前面输出的各个选项对应。
打开daemon.go文件,其中最开始执行的函数是startDaemonCmd,其内部调用startDaemon。
而上面红框内容就是进行API 密码设置的逻辑。这段简单来说,就是首先检查标志AuthenticateAPI是否为true,这个默认就是true,对应终端显示的--authenticate-api 选项,显然,这个默认值明确提示是true。所以会红框部分逻辑必走。那么下一步,检查有无输入--temp-password选项,如果有,走函数passwordPrompt,弹出提示:Enter API password:由用户输入,否则,则走函数apiPassword。如果不输入temp password,则看apiPassword,分析如图。
那么,缺省目录文件又是怎么确定的呢?上面看出,传入的是build.DefaultSiaDir()函数指定。这个那就是在build模块的DefaultSiaDir() 函数了。找到在appdata.go文件中。如下。可以看出,Linux:$HOME/.sia目录下apipassword文件。
由此,我们可知在不输入temp-password选项时,程序的api password决策路径为:
1. 环境变量SIA_API_PASSWORD值;
2.缺省目录下的apipassword文件里面的内容;
3.系统自动生成一个。且下次自动重用之。(系统会给出路径提示。)
如果输入了temp password选项,则:
从标准终端stdin输入。
自此,API password和temp password的关联关系得以清晰。此外,打开server.go文件,发现,其load各个模块的函数:
中,在所有模块加载完毕后,有一段代码:
这说明系统会从环境变量SIA_WALLET_PASSWORD中获取对应的wallet密码自动解锁钱包,而无需用户自己手动解锁了。而之前,服务启动后,钱包默认是锁定状态,需要用户手工解锁。现在只要配置一个环境变量,即可解锁,完全不需要人工参与了,这对我们开发者来说是非常方便的。