<div id="ng5vq"><tr id="ng5vq"></tr></div>

  • <div id="ng5vq"></div>

      <em id="ng5vq"></em>
      <div id="ng5vq"></div>

          专注区块链信息及金融服务

          崇慕:PoS发明人最新项目 VSYS源代码库分析评测

          崇慕 ·

          2018年09月21日

          热度: 50819

          虽然 VSYS主网还未上线,但代码完善度极高,当前在github公开的主要有三个代码库,分别是 VSYS节点、web钱包、冷钱包,可见其生态工具链已经很完善。

          项目概览

          由PoS之父Sunny King 创建的区块链数据库云。 VSYS基于POS自研了业界最高效的共识算法SPOS,目前两大主流公链以太坊和EOS的共识机制都是参考自POS。本次Sunny King带来的SPOS,必然是万众期待。虽然 VSYS主网还未上线,但代码完善度极高,当前在github公开的主要有三个代码库,分别是 VSYS节点、web钱包、冷钱包,可见其生态工具链已经很完善;根据官方周报信息,全节点已在测试网稳定运行2周,没有发现重大bug。

          项目特色

          VSYS为了实现区块链数据库云的目标,独创了很多超前的特性,VSYS项目的4大项目特色分别是灵活的账户体系、媲?#26469;?#32479;数据库的操作方式、协议分层和可插拔系统组件。

          灵活的账户体系

          1. 具备丰富?#24917;?#33394;:

          • 公钥:用户所产生密钥对的公开部分
          • 地址:公钥的一种缩简?#38382;?/li>
          • 虚拟身份/化身:与供临时使用的公钥相比,为长期使用身份
          • 组织:每个身份与多个虚拟身份/化身相关联,并由多个虚拟身份/化身所管理
          • 可替代物:可替代属性的虚拟资产/代币,如货币、股份等
          • 账号:身份所拥有可替代物的容器,类似于银行账户。注意其与传统数据库用户账 户的区别。

          2. 媲?#26469;?#32479;数据库的操作方式

          VSYS平台计划引入高级数据库查询功能。类似于 MongoDB 的对象-关系型查询语言,比传统关系型查询模型(即 SQL)更加灵活。支持的操作有:

          • 创建数据库
          • 插入对象
          • 更新对象
          • 删除对象
          • 创建索引
          • 按索引键值查询

          3. 协议分层

          ? 共识管理层 ? 区块树(Block tree)管理层 ? 链间(Interchain)处理层 ? 交易处理层 ? 数据格式层

          4. 可插拔系统组件

          ? 可插?#38382;?#20849;识模型 ? 可插?#38382;?#19994;务逻辑容器 ? 数据库管理组件 ? 数据库操作组件 ? 数据库查询组件 ? 共享对等网络服务 ? 进?#26143;?#22359;链处理的全节点 ? 智能手机端轻节点冷钱包 ? 智能手机端轻节点热钱包 ? 浏览器端钱包

          代码库基本信息

          VSYS目前在github公布的主要有三个代码库,分别是vee节点、web钱包,冷钱包。?#36865;?#36824;有一个管理公私钥对的命令行工具wallet-generator。

          VEE全节点

          commitscontributorsstars
          5454344

          • commit数量丰富。结合提交历史可以发现VEE代码提交频繁,且?#30475;?#37117;是高质量的代码推送,这个成绩超过现有99%的区块链项目。
          • 代码量(只统计scala主体,不计算脚本和库文件):27706行。可见scala写出的项目代码精简,但功能丰富。相比其他区块链项目动辄10W+的代码量,vee不到3W简直是开发者的福音。
          • 作为未发布主网的区块链项目,34?#36824;?#29486;者很突出,说明国?#26159;?#22359;链开发社区已欣然?#24403;EE,可以预见,随着主网发布完成,开发者社区日益完善,开发者生态很快?#31361;?#19982;EOS,以太坊等现有主流公链并驾齐驱。
          • star数较少,甚至少于贡献者。这是预期中的数字,因为VEE?#30446;?#21457;者生态处于从0到1?#24917;?#35774;过程,目前更多的精力还是应该集中保证主网稳定发布,完善核心功能。

          VSYS-wallet-gui

          基于 SPV(Simplified Payment Verification),NodeJs开发的Web版轻钱包。除了基本的私钥保管,还包括交易、资产保护以及发行基于VEE的代币?#30830;岣还?#33021;。除此之外,web版钱包还支持对冷钱包的监控,通过扫描冷钱包应用程序生成的qr代码,即可在账户窗口查看所有的钱包信息。

          • github

          |commits|contributors|stars| | :--: | :--: | :--: | :--: | |502|6|4|

          vee-cold-android

          基于Android开发的冷钱包。冷钱包主要用于保障存储VSYS的安全性,其关键功能是离线状态下生成和存储私钥。在热钱包的帮助下,可实现转账、租赁?#28982;?#26412;的钱包操作。?#36865;猓?#20919;钱兼容多?#30452;?#20221;恢复方?#31119;?#24182;可在设备之间轻松的迁移。

          commitscontributorsstars
          7531

          wallet-generator

          钱包管理工具。可通过交互式的命令行生成钱包文件,管理公私钥对。

          commitscontributorsstars
          9740

          代码解构

          SPOS共识算法

          VSYS基于POS改造升级了出SPOS(Supernode proof-of-stake)。SPOS提升区块产生的速度,其采用MAB的机制及抢夺?#22836;?#30340;机制,保证了更强的公平性。SPOS目标是60个节点及60个铸币槽(铸币权),初期15个节点和60个铸币槽。这样更有利于初期的参与者获得更多的收益,还在扩展性上提供了更多?#30446;?#38388;。从共识底层架构?#38469;?#23618;面采用了分布式超级节点,按循序出块且间隔固定,在稳定及安全性上得到更好的保障。

          • 我们总结了SPOS的特性:

          • SPOS超级节点按固定顺序出块;
          • 以15个超级节点开启主网,随着网络增长,超级节点数增长到30-60;
          • 块与块之间间隔是固定的,这样带来了更佳稳定的延迟;
          • 60个铸币槽,分别代表了一分钟的60秒;
          • 抢夺/?#22836;?#30340;机制,使得铸币权的竞争更公平(相较DPOS,就是比币数,币可以在多个节点重复投?#20445;?/li>
          • 铸币平均算法MAB,可以支撑币权更好的流动性,不让币往一个地方跑,保持去?#34892;?#21270;,保护网络安全;

          此SPOS机?#35780;创?#30340;好处:

          • 为高性能的公链提供稳定高效的基础设施;
          • 固定?#30446;?#38388;隔设计,带来的是兼具高吞吐量和更加稳定的区块链网络(其他网络的高吞吐都无法保证稳定性,最终也是支持不了高性能业务运行的);
          • 冷铸币的设计,保证了区块链更加安全的性能;
          • 经济系统的设计,鼓励生态系统?#20013;度?#21319;级超级节点,这样保证了系统的运行效果将不断提升;

          • SPOS算法入口如下:

          package vee.consensus.spos
          
          import com.google.common.primitives.{Bytes, Longs}
          import play.api.libs.json.{JsObject, Json}
          import scorex.block.BlockField
          
          case class SposConsensusBlockField(override val value: SposConsensusBlockData)
            extends BlockField[SposConsensusBlockData] {
          
            override val name: String = &quot;SPOSConsensus&quot;
          
            override def bytes: Array[Byte] =
              Bytes.ensureCapacity(Longs.toByteArray(value.mintTime), 8, 0) ++
                Bytes.ensureCapacity(Longs.toByteArray(value.mintBalance), 8, 0)
          
            override def json: JsObject = Json.obj(name -&gt; Json.obj(
              &quot;mintTime&quot; -&gt; value.mintTime,
              &quot;mintBalance&quot; -&gt; value.mintBalance
            ))
          }

          mab算法

          为了保持加权平均余额的良好性能并克服这些缺点,VSYS提出了一种新的平衡称为铸造平均余量(MAB),即: Shn = min {Bhn,αBhn-1 +(1-α)Shn-1}

          • 其中Bhn表示高度hn处的当前平衡。

          • 最小平均余额取当前余额?#22270;?#26435;平均余额的最小值。

          • 计算复杂度仍为O(1)。?#36865;猓?#22312;这个公式中,如果一个人将他/她的余额全部转出,MAB将直接减少到0。使用此属性,总计量平均余额将保守并由总余额控制。

          • mab算法对应的实现如下:

          MAB:weightedBalaceCalc
          
          object SPoSCalc extends ScorexLogging {
          
            // useful constant
            val MinimalEffectiveBalanceForContender: Long = 100000000000000L
          
            // update plan: 4 -&gt; 15 slots, 2 -&gt; 30 slots, 1 -&gt; 60 slots
            val SlotGap = if (AddressScheme.current.chainId == 'M'.toByte) 4 else 1
          
            // update plan: 15 slots -&gt; 36 vee coins, 30 slots -&gt; 18 vee coins, 60 slots -&gt; 9 vee coins
            val BaseReward = 900000000L
            val MintingReward = BaseReward * SlotGap
          
            def weightedBalaceCalc(heightDiff: Int, lastEffectiveBalance: Long, lastWeightedBalance: Long, cntEffectiveBalance: Long, fs: FunctionalitySettings): Long = {
              // mintingSpeed should be larger than 0
              val maxUpdateBlocks = 24 * 60 * 60 / math.max(fs.mintingSpeed, 1) * 1L
              val weightedBalance = math.min(lastEffectiveBalance/maxUpdateBlocks * math.min(maxUpdateBlocks, heightDiff)
                + lastWeightedBalance/maxUpdateBlocks * (maxUpdateBlocks - math.min(maxUpdateBlocks, heightDiff)),
                cntEffectiveBalance)
              weightedBalance
            }
          
            def mintingBalance(state: StateReader, fs: FunctionalitySettings, account: Address, atHeight: Int): Long = {
              //TODO: we should set the mintingBalance for Genesis case
              // this function only useful for spos minting process
              // here atHeight should be larger than lastHeight (validation)
          
              val lastHeight = state.lastUpdateHeight(account).getOrElse(0)
              val lastWeightedBalance = state.lastUpdateWeightedBalance(account).getOrElse(0L)
              val lastEffectiveBalance = state.effectiveBalanceAtHeightWithConfirmations(account,lastHeight,0)
              val cntEffectiveBalance = state.effectiveBalance(account)
          
              val weightedBalance = lastHeight == atHeight match {
                case true =&gt; state.lastUpdateWeightedBalance(account).getOrElse(0L)
                case _ =&gt; weightedBalaceCalc(atHeight - lastHeight, lastEffectiveBalance, lastWeightedBalance, cntEffectiveBalance, fs)
              }
              weightedBalance
            }
          
            // TODO: all SPoS related functions will be defined here
          
          }

          公链对比

          开发语言共识机制TPS账户设计打包时间
          比特币C++POW7UTXO10分钟
          以太坊GOPOW+POS小于100Account based15秒
          EOSC++DPOS3500-4000Account based小于1秒
          VEEscalaSPOS3500-4000Account based小于4秒

          • 比特币:区块链的龙头老大,知名度最高,受众最广;代表区块链1.0
          • 以太坊:首先提出智能合约的概念,开源社区最为成熟;代表区块链2.0
          • EOS?#22909;?#32423;出块速度,Dapp生态最为?#27604;伲?#20195;表区块链3.0
          • VSYS:由PoS之父Sunny King 创建的区块链数据库云,自研了最高效的共识算法SPOS;代表区块链5.0

          从开发语言来看。比特币和EOS基于C++,开发门槛最高,目前EOS的智能合约只支持C++,且在短期内没有支?#21046;?#20182;语言?#30446;?#33021;;以太坊基于GO,开发门槛稍低,但GO语言的生态远不如JAVA,C/C++,并且GO自身的特性还有很多需要完善的地方; VSYS基于scala开发,scala语言性能优异,完美兼容java生态体系,想必Sunny King选择scala也是预见到它的潜力。

          从共识机?#35780;?#30475;。PoW(Proof of Power)即工作量证明,是最有名也是目前使用最广泛的共识算法,虽然通过争夺记账权的方式一定程度上保证了整个网络的安全性,但消耗了巨大的资源,从结果上来说所有?#24917;?#28857;都在做毫无意义的运算;而且挖矿机制导致平均10分钟才形成一个区块,很多区块被确认时间超过2个小时,交易速度延迟度非常高。PoS(Proof of Stake)即股权证明,由质数币、点点币、VSYS的?#35789;?#20154;Sunny King提出,PoS 试图解决 PoW 机制中大量资源被浪费的情况,这种机制通过计算你持有占总币数的百分比以及占有币数的时间来决定记账权;其被提出后受到业界热?#26131;放酰?#21306;块链2.0的大量公链包括以太坊都是采用POS共识机制。DPoS(Delegated Proof of Stake)?#27425;?#25176;股权证明,是 PoS 的变种方?#31119;?#27604;特股 BTS 和EOS?#35789;?#29992; DPoS共识机制,DPOS相较于POS的变化在于通过不同的策略,不定时的选中一小群节点,这一小群节点做新区块的创建,验证,签名和相互监督,这样就大幅度的减少了区块创建和确认所需要消耗的时间?#36864;?#21147;成本。SPOS(Supernode Proof-of-Stake)即超级节点股权证明,很明显,SPOS是POS?#24917;?#21270;版本,代表区块链5.0的共识机制,由POS的?#35789;?#20154;Sunny King亲自操刀,SPOS的出现,代表着公链在性能上获?#32654;?#31243;碑式的突破,基于SPOS的VSYS公链能够承载海量的dapp生态,使得区块链产品大规模落地成为可能。

          测试网络部署

          • 服务器OS版本:Ubuntu 16.04.5 LTS
          • VSYS版本:v0.1rc1

          Install JRE 1.8

          sudo add-apt-repository -y ppa:webupd8team/java
          sudo apt-get update
          sudo apt-get -y install oracle-java8-installer

          • 确认安装成功
            java -version

          Install SBT (Scala Build Tool)

          echo &quot;deb https://dl.bintray.com/sbt/debian /&quot; | sudo tee -a /etc/apt/sources.list.d/sbt.list
          sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
          sudo apt-get update
          sudo apt-get install sbt

          • Tips?#32791;?#20123;版本的ubuntu执行sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823的时候可能会报错:

            $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
            Executing: /tmp/apt-key-gpghome.hEtryDWci3/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
            gpg: failed to start the dirmngr '/usr/bin/dirmngr': No such file or directory
            gpg: connecting dirmngr at '/tmp/apt-key-gpghome.hEtryDWci3/S.dirmngr' failed: No such file or directory
            gpg: keyserver receive failed: No dirmngr

            > 按照提示先安装dirmngr即可:$ sudo apt-get install dirmngr

          • 确认sbt安装成功

            $ which sbt
            /usr/bin/sbt

          安装VSYS节点服务

          • 下载deb安装文件

            mkdir ~/vee &amp;&amp; wget https://github.com/excelsia/vee/releases/download/v0.1rc1/vee-testnet_0.1rc1.deb
          • 安装

            $ sudo dpkg -i vee*.deb
            Selecting previously unselected package vee-core-testnet.
            (Reading database ... 51859 files and directories currently installed.)
            Preparing to unpack vee-testnet_0.1rc1.deb ...
            Unpacking vee-core-testnet (0.0.3) ...
            Setting up vee-core-testnet (0.0.3) ...
            Warning: The home dir /var/lib/vee-core-testnet you specified can't be accessed: No such file or directory
            Adding system user `vee-core-testnet' (UID 112) ...
            Adding new group `vee-core-testnet' (GID 116) ...
            Adding new user `vee-core-testnet' (UID 112) with group `vee-core-testnet' ...
            Not creating home directory `/var/lib/vee-core-testnet'.
            Creating default config file ...
            Installing systemd service ...
            Created symlink from /etc/systemd/system/multi-user.target.wants/vee-core-testnet.service to /lib/systemd/system/vee-core-testnet.service.
          • systemctl启动服务并确认启动状态

            $ sudo systemctl start vee-core-testnet.service 
            $ sudo systemctl status vee-core-testnet.service

          > 服务启动正常,整个部署过程简洁,清晰。

          配置文件

          • vee配置文件路径:/etc/vee-core-testnet/,重点分析vee.conf

            1 vee {
            2   #directory = /tmp/vee
            3   logging-level = DEBUG
            4   network {
            5     known-peers = [&quot;52.8.148.150:19923&quot;, &quot;18.130.233.104:9923&quot;]
            6     black-list-residence-time = 30s
            7     peers-broadcast-interval = 5s
            8     connection-timeout = 30s
            9   }
            10   wallet {
            11     password = &quot;&quot;
            12   }
            13   blockchain {
            14     type = TESTNET
            15   }
            16   checkpoints.public-key = 4HmYEMpPaJXJsDgdjGfFNXLAY2CdDAfhynwSL9BqydNA
            17   matcher.enable = no
            18   miner {
            19     enable = yes
            20     offline = no
            21     quorum = 1
            22     generation-delay = 1s
            23     interval-after-last-block-then-generation-is-allowed = 120h
            24     tf-like-scheduling = no
            25     reward-address = &quot;&quot;
            26   }
            27   rest-api {
            28     enable = yes
            29     bind-address = 0.0.0.0
            30     #api key veetest2018 for hash Fo8fR7J1gB3k2WoaE6gYKMwgWfoh9EtZtXAMBxYYCJWG
            31     api-key-hash = Fo8fR7J1gB3k2WoaE6gYKMwgWfoh9EtZtXAMBxYYCJWG
            32   }
            33   utx.broadcast-interval = 3s
            34 }
          • 网络相关配置:

            • known-peers:本地节点初始化启动时连接的种子节点,目前默认是两个。这也是为什么本地节点启动就可以正常工作的原因。
            • peers-broadcast-interval:节点信息同步的周期,?#28909;?#22914;果设置为5s,就是每隔5秒钟同步一次known-peers节点信息。
            • black-list-residence-time?#33322;?#33410;点列入黑名单的时间
            • connection-timeout:peer节点网络连接超时时间
          • 钱包相关配置:

            • file:指定wallet文件的路径,如果不指定默认的钱包文件为/var/lib/vee-core-testnet/wallet/wallet.dat
            • password:设定保护钱包文件的密钥
          • blockchain配置:

            • type:区块链网络类型,测试网络对应的值为TESTNET
          • miner配置

            • enable?#21644;?#30719;开关
            • offline:节点脱机开关
            • quorum?#27627;?#25509;多少个peer节点触发挖矿。默认为1表示只要连接一个peer节点就开始挖矿,设为0意味着节点离线状态?#37096;?#20197;生成区块,类似solo模式。
            • generation-delay:生成区块的超时时间
            • interval-after-last-block-then-generation-is-allowe:意味着本地节点将不会开始产生区块直到有最后一个时间不超过120小时的区块
            • reward-address:自定义本地节点挖矿奖励的地址,默认为空即挖矿成功后自动发送到本地节点地址,?#37096;?#20197;指定冷钱包地址,无疑这样安全性更高。
          • REST API配置

            • enable:激活或关闭rest-api功能
            • bind-address:指定rest-api绑定地址,如0.0.0.0表示开放外来连接
            • api-key-hash:api-key的哈希值,默认为Fo8fR7J1gB3k2WoaE6gYKMwgWfoh9EtZtXAMBxYYCJWG

          vee.conf详细的配置模板参见:https://github.com/excelsia/vee/blob/master/vee-testnet.conf

          节点数据

          • VSYS数据目录

            /var/lib/vee-core-testnet/
          • 进入数据目录查看,区块链数据文件blockchain.dta同步完成后目前大小为373M。

            $ ls -alh
            total 422M
            drwxr-xr-x 2 vee-core-testnet vee-core-testnet 4.0K Sep 15 05:09 .
            drwxr-xr-x 5 vee-core-testnet vee-core-testnet 4.0K Sep 15 05:09 ..
            -rw-r--r-- 1 vee-core-testnet vee-core-testnet 373M Sep 15 08:04 blockchain.dat
            -rw-r--r-- 1 vee-core-testnet vee-core-testnet 8.0K Sep 15 05:09 checkpoint.dat
            -rw-r--r-- 1 vee-core-testnet vee-core-testnet  52K Sep 15 08:52 peers.dat
            -rw-r--r-- 1 vee-core-testnet vee-core-testnet  49M Sep 15 09:00 state.dat

          节点部署总结

          VSYS?#24917;?#28857;部署简单程度绝对会让开发者惊喜。如果是第一次部署节点,不需要改动任何?#38382;?#21644;配置,按照文档步骤10分钟以内即可将本地节点搭建完成。?#36865;猓?#24456;期待VEE社区完善对更多系统以及docker容器的支持。

          评测总结

          本文通过项目概览、项目特色、github库信息、代码解构、公链对比、节点部署等多维度对VSYS项目进行全方位的?#38469;?#35780;测。结论是VSYS项目独具特色,与其定位"区块链数据库及应用平台"相符。VSYS生态工具链完成度非常高,由Sunny King亲?#28304;?#39046;的?#38469;?#22242;队实力毋庸置疑。具体工程实现上由scala开发的VSYS节点性能高效,考虑到scala完全兼容java?#38469;?#26632;,一旦主网发布必然能借势java生态获得大量开发者的?#25918;酢?#22312;公链对?#28982;?#33410;,我们可以发现从比特币、以太坊、EOS再到VSYS,代表着公链的版本升级,生态也日趋?#27604;伲?#22522;于SPOS共识机制的VSYS 将成为继以太坊、EOS之后里程碑式的公链项目,值得长期期待。最后,评测小组对VSYS节点进行部署测试,10分钟内即完成本地节点搭建,在评测期间(一周)节点运行状态良好。

          参考资料

          https://talk.peercoin.net/search?q=sunn%20%20king

          https://talk.peercoin.net/t/sunny-king-interviewed-by-crypto-capitalism-center-july-06-2016/3980

          https://talk.peercoin.net/t/peercointalks-community-interview-with-sunny-king-3-may-24th-2014/2415

          https://bitcointalk.org/index.php?topic=2564861.0

          https://talk.peercoin.net/t/transcript-of-sunny-king-interview-with-vitalik-buterin-from-bitcoinmagazine/463

          https://medium.com/new-kids-on-the-block-chain/a-short-on-sunny-king-return-of-the-king-inventor-of-pos-474e534739dc

          https://www.swissinfo.ch/eng/vee-project_sunny-king-returns-to-take-on-blockchain-database-puzzle/43873586

          [Back 2014] Enabling Blockchain Innovationswith Pegged Sidechains, https://blockstream.com/sidechains.pdf

          [Buterin 2014] Ethereum: A Next-GenerationSmart Contract and Decentralized application Platform, http://www.the-blockchain.com/docs/Ethereumwhitepapera_nextgenerationsmartcontractanddecentralizedapplication_platform-vitalik-buterin.pdf

          [King 2012] PPCoin: Peer-to-PeerCrypto-Currency with Proof-of-Stake, https://peercoin.net/assets/paper/peercoin-paper.pdf

          [King 2013] Primecoin: Cryptocurrency withPrime Number Proof-of-Work, http://primecoin.io/bin/primecoin-paper.pdf

          [Lamport 1982] The Byzantine GeneralsProblem, http://lamport.azurewebsites.net/pubs/byz.pdf

          [Nakamoto 2008] Bitcoin: A Peer-to-PeerElectronic Cash System, https://bitcoin.org/bitcoin.pdf

          [Poon 2017] Plasma: Scalable Autonomous SmartContracts, https://plasma.io/plasma.pdf

          [Silver 2016] Mastering the game of Go withdeep neural networks and tree search, https://storage.googleapis.com/deepmind-media/alphago/AlphaGoNaturePaper.pdf

          [Szabo 1996] Smart Contracts: Building Blocksfor Digital Markets, 


          文章声明:本文为火星财经专栏作者作品,不代表火星财经观点,版权归作者所有,如需转载,请提前联系作者或注明出处。

          声明:本文为入驻“火星号”作者作品,不代表火星财经官方立场。转载请注明出处、作者和本文链接
          提示?#21644;?#36164;有风险,入?#34892;?#35880;慎。本资讯不作为投资理财建议。

          推广
          相关新闻

          涨幅榜

          你可能?#34892;?#36259;的内容
          下一篇

          区块链+房地产:不动产链上证券化?#30446;?#34892;性研究

          河北十一选五软件