Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
whqwjb
go-ethereum
提交
f1fcda4f
G
go-ethereum
项目概览
whqwjb
/
go-ethereum
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
go-ethereum
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f1fcda4f
编写于
3月 13, 2015
作者:
O
obscuren
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implemented managed state
* Reimplemented nonce management for known accounts.
上级
cda88ce3
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
90 addition
and
24 deletion
+90
-24
core/block_processor.go
core/block_processor.go
+2
-4
state/managed_state.go
state/managed_state.go
+32
-18
state/managed_state_test.go
state/managed_state_test.go
+54
-0
xeth/xeth.go
xeth/xeth.go
+2
-2
未找到文件。
core/block_processor.go
浏览文件 @
f1fcda4f
...
...
@@ -79,12 +79,10 @@ func (self *BlockProcessor) ApplyTransaction(coinbase *state.StateObject, stated
statedb
.
EmptyLogs
()
cb
:=
statedb
.
GetStateObject
(
coinbase
.
Address
())
/*
st := NewStateTransition(NewEnv(statedb, self.bc, tx, block), tx, cb)
_, err := st.TransitionState()
*/
_
,
gas
,
err
:=
ApplyMessage
(
NewEnv
(
statedb
,
self
.
bc
,
tx
,
block
),
tx
,
cb
)
if
err
!=
nil
&&
(
IsNonceErr
(
err
)
||
state
.
IsGasLimitErr
(
err
)
||
IsInvalidTxErr
(
err
))
{
// If the account is managed, remove the invalid nonce.
self
.
bc
.
TxState
()
.
RemoveNonce
(
tx
.
From
(),
tx
.
Nonce
())
return
nil
,
nil
,
err
}
...
...
state/managed_state.go
浏览文件 @
f1fcda4f
...
...
@@ -2,44 +2,53 @@ package state
import
"sync"
type
account
struct
{
stateObject
*
StateObject
nstart
uint64
nonces
[]
bool
}
type
ManagedState
struct
{
*
StateDB
mu
sync
.
RWMutex
accounts
map
[
string
]
*
StateObjec
t
accounts
map
[
string
]
*
accoun
t
}
func
ManageState
(
statedb
*
StateDB
)
*
ManagedState
{
return
&
ManagedState
{
StateDB
:
statedb
,
accounts
:
make
(
map
[
string
]
*
StateObjec
t
),
accounts
:
make
(
map
[
string
]
*
accoun
t
),
}
}
func
(
ms
*
ManagedState
)
IncrementNonce
(
addr
[]
byte
)
{
ms
.
mu
.
Lock
()
defer
ms
.
mu
.
Unlock
()
ms
.
getAccount
(
addr
)
.
nonce
++
}
func
(
ms
*
ManagedState
)
DecrementNonce
(
addr
[]
byte
)
{
// Decrementing a nonce does not mean we are interested in the account
// incrementing only happens if you control the account, therefor
// incrementing behaves differently from decrementing
func
(
ms
*
ManagedState
)
RemoveNonce
(
addr
[]
byte
,
n
uint64
)
{
if
ms
.
hasAccount
(
addr
)
{
ms
.
mu
.
Lock
()
defer
ms
.
mu
.
Unlock
()
ms
.
getAccount
(
addr
)
.
nonce
--
account
:=
ms
.
getAccount
(
addr
)
if
n
-
account
.
nstart
<
uint64
(
len
(
account
.
nonces
))
{
reslice
:=
make
([]
bool
,
n
-
account
.
nstart
)
copy
(
reslice
,
account
.
nonces
[
:
n
-
account
.
nstart
])
account
.
nonces
=
reslice
}
}
}
func
(
ms
*
ManagedState
)
Get
Nonce
(
addr
[]
byte
)
uint64
{
func
(
ms
*
ManagedState
)
New
Nonce
(
addr
[]
byte
)
uint64
{
ms
.
mu
.
RLock
()
defer
ms
.
mu
.
RUnlock
()
return
ms
.
getAccount
(
addr
)
.
nonce
account
:=
ms
.
getAccount
(
addr
)
for
i
,
nonce
:=
range
account
.
nonces
{
if
!
nonce
{
return
account
.
nstart
+
uint64
(
i
)
}
}
account
.
nonces
=
append
(
account
.
nonces
,
false
)
return
uint64
(
len
(
account
.
nonces
))
+
account
.
nstart
}
func
(
ms
*
ManagedState
)
hasAccount
(
addr
[]
byte
)
bool
{
...
...
@@ -47,10 +56,15 @@ func (ms *ManagedState) hasAccount(addr []byte) bool {
return
ok
}
func
(
ms
*
ManagedState
)
getAccount
(
addr
[]
byte
)
*
StateObjec
t
{
func
(
ms
*
ManagedState
)
getAccount
(
addr
[]
byte
)
*
accoun
t
{
if
_
,
ok
:=
ms
.
accounts
[
string
(
addr
)];
!
ok
{
ms
.
accounts
[
string
(
addr
)]
=
ms
.
GetOrNewStateObject
(
addr
)
so
:=
ms
.
GetOrNewStateObject
(
addr
)
ms
.
accounts
[
string
(
addr
)]
=
newAccount
(
so
)
}
return
ms
.
accounts
[
string
(
addr
)]
}
func
newAccount
(
so
*
StateObject
)
*
account
{
return
&
account
{
so
,
so
.
nonce
-
1
,
nil
}
}
state/managed_state_test.go
0 → 100644
浏览文件 @
f1fcda4f
package
state
import
"testing"
var
addr
=
[]
byte
(
"test"
)
func
create
()
(
*
ManagedState
,
*
account
)
{
ms
:=
ManageState
(
nil
)
ms
.
accounts
[
string
(
addr
)]
=
newAccount
(
&
StateObject
{
nonce
:
100
})
return
ms
,
ms
.
accounts
[
string
(
addr
)]
}
func
TestNewNonce
(
t
*
testing
.
T
)
{
ms
,
_
:=
create
()
nonce
:=
ms
.
NewNonce
(
addr
)
if
nonce
!=
100
{
t
.
Error
(
"expected nonce 101. got"
,
nonce
)
}
}
func
TestRemove
(
t
*
testing
.
T
)
{
ms
,
account
:=
create
()
nn
:=
make
([]
bool
,
10
)
for
i
,
_
:=
range
nn
{
nn
[
i
]
=
true
}
account
.
nonces
=
append
(
account
.
nonces
,
nn
...
)
i
:=
uint64
(
5
)
ms
.
RemoveNonce
(
addr
,
account
.
nstart
+
i
)
if
len
(
account
.
nonces
)
!=
5
{
t
.
Error
(
"expected"
,
i
,
"'th index to be false"
)
}
}
func
TestReuse
(
t
*
testing
.
T
)
{
ms
,
account
:=
create
()
nn
:=
make
([]
bool
,
10
)
for
i
,
_
:=
range
nn
{
nn
[
i
]
=
true
}
account
.
nonces
=
append
(
account
.
nonces
,
nn
...
)
i
:=
uint64
(
5
)
ms
.
RemoveNonce
(
addr
,
account
.
nstart
+
i
)
nonce
:=
ms
.
NewNonce
(
addr
)
if
nonce
!=
105
{
t
.
Error
(
"expected nonce to be 105. got"
,
nonce
)
}
}
xeth/xeth.go
浏览文件 @
f1fcda4f
...
...
@@ -353,7 +353,7 @@ func (self *XEth) Transact(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeSt
}
state
:=
self
.
chainManager
.
TxState
()
nonce
:=
state
.
GetNonce
(
from
)
nonce
:=
state
.
NewNonce
(
from
)
//state.
GetNonce(from)
tx
.
SetNonce
(
nonce
)
if
err
:=
self
.
sign
(
tx
,
from
,
false
);
err
!=
nil
{
...
...
@@ -362,7 +362,7 @@ func (self *XEth) Transact(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeSt
if
err
:=
self
.
eth
.
TxPool
()
.
Add
(
tx
);
err
!=
nil
{
return
""
,
err
}
state
.
IncrementNonce
(
from
)
//
state.IncrementNonce(from)
if
contractCreation
{
addr
:=
core
.
AddressFromMessage
(
tx
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录