今天给大家讲解的论文是关于构建区块链用户画像的,它的中文题目是《区块链正在注视着你:对以太坊用户进行分析和去匿名化》
文章目录
2009年,比特币诞生了。它的诞生带来了一种新的去中心化交易模式。在比特币的交易模式下,交易记录是匿名的,仅以地址来代替账户。人们只能看到地址之间的交易信息,但是无法获取使用者的身份信息,因此用户的隐私性得到了极大的保证。
但是,这种匿名性给国家监管机构带来了极大的不便,比如:洗钱、走私、毒品交易等非法活动在这种匿名交易模式下很难追踪识别。因此,将比特币交易去匿名化是一项非常有必要的。
针对区块链去匿名化问题,今天这篇论文的作者基于以太坊进行了一些探索,并提出了一些新的解决思路。
接下来,我将从以下三个方面进行讲解:相关概念,作者实验方法与结论,对链上数据分析与用户画像构建的思考。
数据以表的形式表示,每一行表示一条记录(record),每一列表示一个属性(attribute)。每一个记录与一个特定用户/个体关联。这些属性可以分为三类:1. 标识符:可直接确定一个个体,如:身份证号;2.准标识符集:可以和外部表连接来识别个体的最小属性集,如:图1{邮编,年龄};3.敏感数据:用户不希望被人知道的数据,可以认为数据表中除了标识符和准标识符之外都是敏感数据,如图2的disease。
当公开数据表时,应避免用户的敏感数据被公开,也即不能让观察者者将某条记录和一个确定的用户联系起来。信息公开(information disclosure)可以分为两类:1. 身份公开::指可以将用户和特定记录联系起来;2.属性公开:当新公开的信息可以使观察者更准确地推测用户的特征时,称发生了属性公开。
如下图所示,图2是图1经过k-匿名处理后的数据,它使得同一等价类中记录对于敏感属性不能与其他k-1条记录相区分。


去匿名化是指一种数据挖掘策略,其中的匿名数据和其它数据来源相互对照来重新识别匿名的数据来源。区别一个数据来源和另一个数据来源的任一信息都能用于去匿名化。
这里我们主要以社会网络为例,因为社会网络的图结构在后面会讲到。社会网络的去匿名化主要针对的是节点的去匿名化,识别一个节点就是获得一个人的真实信息。对于社会网络的去匿名化方法可以分为两类,一类是基于映射的方法,另一类是基于猜测的方法。基于映射的方法是将攻击者了解的或爬取得到的真实网络结构与公开的经过匿名化的网络结构数据做节点匹配。基于猜测的方法则是利用攻击者已知的背景知识在公开数据中找到符合的一个或多个节点。本文作者做的去匿名化实际上做的是地址匹配或者说节点匹配。

用户画像,即用户信息标签化,就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后抽象出一个用户的商业全貌。


形式上讲,Embedding就是用一个低维稠密的向量“表示”一个对象,这里所说的对象可以是一个词(Word2Vec),也可以是一个物品(Item2Vec),亦或是网络关系中的节点(Graph Embedding)。其中“表示”这个词意味着Embedding向量能够表达相应对象的某些特征,同时向量之间的距离反映了对象之间的相似性。或者说更直白一点,它就是一个矩阵。Embedding将一个东西映射成一个向量,如果两个东西很像,那么得到的向量距离就会很小。下面举几个例子:
知道什么是Embedding之后,我们开始讨论Node Embedding了。在传统机器学习任务中,我们需要根据下游任务来提取指定的特征,如果下游任务变化了,提取的特征也需要变化,也即是依赖下游任务导向。
很显然,传统机器学习算法很难提取图结构数据的特征的。因为,图的特征信息很多是隐式的、抽象的、高维的、与任务无关的。因此,我们需要借助图表示学习将高维度信息降维到低维度空间,同时最大化保留原有图原本的结构信息。此外,它还有一个很重要的一个优点就是它弱化了对下游任务的依靠,不需要针对不同的任务每次都进行不同的特征提取。
因此,我们可以使用Node Embedding将图中节点映射到一个向量空间,同时保持节点的某些性质。


当节点映射到向量空间之后就可以进行各种下游任务了。

Danaan-Gift attack 首次在《Privacy Aspects and Subliminal Channels in Zcash》中被提出,它的意思是说:攻击者向目标的shielded address发送少量受污染的zcash,当目标de-shielded时这些值会保留下来,起到标记的作用。它基于这样一个事实:zcash的交易值精确度很高,最后几位数字没有经济意义,但是可以被用作fingerprint value。
在作者的定义中,交易价值的指纹是它在 Zatoshis 中的最后 7 位数字,尤其是最后4位数字特别稳定。由于最后四位数字低于交易的门槛费用,所以它没有什么经济意义,只代表了以前交易的残余。在区块链世界中,矿池支出都是以全精度计算的,因此会在最低有效数字中产生随机分布,所以fingerprint value的独特性可以得到保证。在作者的实验中,他们认为如果最后7位中有5位是相同的,或者最后4位都是相等的,这两个fingerprint value就是匹配的。
本文作者主要做了三个实验:以太坊用户画像与去匿名化、对混币服务进行去匿名化、以太坊上的Danaan-Gift攻击。
本文实验数据以ETH地址为基础,来源有三个:Twitter API、Humanity DAO、TC mixer contracts。作者收集到地址之后通过ETH区块浏览器查询交易信息。Humanity DAO可以理解为一种实验,它鼓励参与者进行去中心化的登记与注册;TC mixer contracts


本文的评估方法有两个,一个是AUC,还有一个是熵增益。
对于前两个实验,算法会为测试集中的每个账户返回一个候选对的排名列表,每个排名列表里面只有一对是正确匹配的,则AUC可以表示为下式:
A
U
C
=
a
v
g
(
r
(
a
)
∣
c
(
a
)
∣
)
AUC=avg(\frac{r(a)}{|c(a)|})
AUC=avg(∣c(a)∣r(a)) over all
a
a
a, and
r
(
a
)
r(a)
r(a) is the rank of correct pair.
除了衡量匹配的AUC之外,作者还想量化去匿名化匹配带来的隐私损失。在这里,作者巧妙地将攻击者获得的信息表示为熵增益,即先验熵和后验熵的差异。注:先验熵是指没有使用去匿名化方法。对于TC mixer contracts来说,匿名集的大小是动态变化的,因此我们需要首先证明匿名集的大小对于我们比较熵增益是没有影响的。
论证:先验匿名集大小对熵增益没有影响
Δ
=
g
a
i
n
(
2
n
,
p
)
−
g
a
i
n
(
n
,
p
)
\Delta=gain(2n,p)-gain(n,p)
Δ=gain(2n,p)−gain(n,p),作者在概率分布为p的条件下,对大小为2n和n的匿名集的熵增益做差处理。如果概率分布是平滑的,且在邻域范围内变化很小,那么上述的差值就会很小,就可以近似认为先验匿名集大小对熵增益没有影响。
推断后验概率分布
对于每个大小为
n
n
n、正确匹配对排名为
r
r
r的匿名集,其概率
P
(
n
,
r
)
P(n,r)
P(n,r)在
[
(
r
−
1
)
/
n
,
r
/
n
]
[(r-1)/n,r/n]
[(r−1)/n,r/n]均匀分布。后验概率分布就是
P
(
n
,
r
)
P(n,r)
P(n,r)的平均值。注:前面说了算法为每个账户返回候选对列表,其实就是匿名集。
计算熵增益
作者选用恰好有两个地址的ENS names,并挑选三个准标识符:交易时间、汽油费、以太坊交易图位置进行用户画像分析,最后将属于同一用户的账户关联起来。

在进行交易图分析的时候,本文作者率先采用节点嵌入的方法对同一用户的账户进行匹配识别,并同仅使用其他两个准标识符进行识别的方法进行对比。



在进行交易图分析的时候,本文作者率先采用节点嵌入的方法对同一用户的账户进行匹配识别,并同仅使用其他两个准标识符进行识别的方法进行对比。



在TC mixer contracts的混币服务中,存入地址与赎回地址可能存在重复使用的情况,这会导致隐私方面的风险。于是,作者采用节点嵌入方法进行去匿名化,最终找到存入地址对应的赎回地址。

作者对以太坊上进行Danaan-Gift攻击做了一个指纹存活概率的分析,说明了在以太坊进行该攻击的可能性。

地址数量会不知不觉误导你
地址数量是最常见的一个具有误导性的指标,因为并非所有的地址都同等重要。交易创建的一个用于临时性转账的地址,显然不能和另一个长期持有资产的钱包地址相提并论。
匿名性 vs. 可解读性
在区块链数据集中匿名性与可解读性之间的摩擦相对来说还比较小。一个区块链数据集的匿名性越高,从中获取有意义的信息的难度就越大。

去匿名化 vs. 隐私保护
去匿名化区块链数据集并不涉及了解每个参与者的真实身份。「你是什么」远比「你是谁」要重要。
Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation
尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg
我想通过控制台手动创建一个用户:User.find_or_create_by(email:"user@mail.com",first_name:"Stan",last_name:"Smith",password:"password",password_confirmation:"password",confirmed_at:Time.now)我在过去的项目中多次这样做,但这次没有用。它没有获取Devise密码模型属性,所以这是我得到的错误:PG::UndefinedColumn:ERROR:columnusers.passworddoesnotexist我有Rails4.1.4和Dev
问题localhost:3000/users/不会显示我谦虚地进入,因为我是第一次尝试通过Rails教程。我在第10章,我已经花了5个小时解决这个问题。当我尝试访问localhost:3000/users/时出现错误(我相信这与factory_girl有关)解释了@users变量为空并且我忘记了为will_paginate传递一个集合对象。我目前在第10章第10.23节,每次运行时:$bundleexecrakedb:reset$bundleexecrakedb:populate$bundleexecrakedb:test:prepare我在解释时遇到错误rakeaborted!Fac
我已经使用Rails几个月了,我很乐意编写一个项目并根据我的需要操作Rails等。最近我一直在尝试更高级一些,所以我尝试修改/添加到现有的Rails代码库:添加新的表单辅助方法、添加responds_to:pdf方法等...然后我遇到了很多问题。困难在于学习我需要修改哪些代码;该代码所在的位置,以及如何确保我不会错过其他文件中的相关代码。我猜人们有办法学会这样做,但目前我主要只是猜测和希望。我想我的问题是,Rails人员如何了解他们需要修改的代码在哪里编辑以及编辑代码的方法?看起来这只是您需要先熟悉的东西,但我猜必须有一种简单的方法来理解在哪里(和什么)编辑。任何想法表示赞赏.....
在RoR中,我有时会看到:render@users或render'new'两者有何不同? 最佳答案 简而言之,render@users正在渲染类型为User的对象集合,其中包含一个名为_user.html.erb的部分文件,并且render'new'正在呈现newAction并且等同于render:action=>new。最好查看LayoutsandRenderinginRailsRubyonRails指南中的页面,以了解这两个如何工作以及可以在何处适当使用它们,以及使这些和许多其他方便的render方法成为可能的各种内置假设。
我安装了rvm(ruby版本管理器)并且成功了,但是我得到了WARNING:Youhave'~/.profile'file,youmightwanttoloadit,todothataddthefollowinglineto'/Users/myname/.bash_profile':source~/.profile我是开发、终端和所有爵士乐的新手!但迟到总比不到好?!我进入了终端:'/Users/myname/.bash_profile'然后得到下面一行-bash:/Users/myname/.bash_profile:Permissiondeniedmyname-MacBook-Pr
目前,我的Users数据库有一个名为“admin”的列,其值为bool值,默认设置为false。我有一个管理员用户播种到数据库中。如何编写我的应用程序以便是管理员的用户可以创建新用户,而不是的用户不能?(此外,用户应该仅由管理员创建)似乎应该有一种简单的方法可以在不涉及使用某些外部模块的设计中做到这一点。然而,到目前为止,我还没有找到满意的答案。我更有可能标记仅是设计的解决方案。(一个简单的标准MVC/Rails解决方案加分)但是,如果真的有更好的方法来做到这一点而不涉及CanCan,我可能也接受它。注意:我已经搜索了一段时间,发现了其他几个与这个问题非常相似的stackoverflo
我用devise和漂亮的生成器创建了一个数据库。我正在尝试使用漂亮的生成器(railsgnifty:scaffoldAssetuser_id:integer)创建一个新数据库,但是当我尝试迁移数据库时(rakedb:migrate),我收到以下错误:charlotte-dator:showwwdownholgersindbaek$rakedb:migrate==DeviseCreateUsers:migrating==============================================--create_table(:users)rakeaborted!Anerror
我正在开发一个允许用户创建帐户的网站。创建用户时的属性之一是用户个人网站。当我尝试像这样使用用户网站时:生成的url是:http://0.0.0.0:3000/www.userswebsite.com我认为这是因为link_to的@user部分...但是我怎样才能让它链接到www.userwebsite.com? 最佳答案 如果协议(protocol)不存在,您可以在url前加上协议(protocol):moduleUrlHelperdefurl_with_protocol(url)/^http/i.match(url)?url:"